Как выполнить SetBinding и BindingContext на странице XAML?

В настоящее время я пытаюсь разработать приложение на основе страницы с вкладками Xamarin Forms. Сначала в приложении была только одна страница содержимого, написанная на C#. Что я хочу сделать сейчас, так это внедрить эту существующую страницу содержимого в одну из вкладок страницы с вкладками.

Я пишу страницу с вкладками в XAML и не знаю, как выполнить «SetBinding» или «BindingContext» на этом языке.

Вот что я хочу перевести с C# на XAML:

    public MyPage()
    {

        this.BindingContext = new MyPageViewModel();

        Picker pickerBluetoothDevices = new Picker() { Title = "Select a bth device" };
        pickerBluetoothDevices.SetBinding(Picker.ItemsSourceProperty, "ListOfDevices");
        pickerBluetoothDevices.SetBinding(Picker.SelectedItemProperty, "SelectedBthDevice");
        pickerBluetoothDevices.SetBinding(VisualElement.IsEnabledProperty, "IsPickerEnabled");

        Entry entrySleepTime = new Entry() {Keyboard = Keyboard.Numeric, Placeholder = "Sleep time" };
        entrySleepTime.SetBinding(Entry.TextProperty, "SleepTime");

        Button buttonConnect = new Button() { Text = "Connect" };
        buttonConnect.SetBinding(Button.CommandProperty, "ConnectCommand");
        buttonConnect.SetBinding(VisualElement.IsEnabledProperty, "IsConnectEnabled");

        Button buttonDisconnect = new Button() { Text = "Disconnect" };
        buttonDisconnect.SetBinding(Button.CommandProperty, "DisconnectCommand");
        buttonDisconnect.SetBinding(VisualElement.IsEnabledProperty, "IsDisconnectEnabled");

        Button buttonSend = new Button() { Text = "Send" };
        buttonSend.SetBinding(Button.CommandProperty, "SendCommand");
        buttonSend.SetBinding(VisualElement.IsEnabledProperty, "IsSendEnabled");

        StackLayout slButtons = new StackLayout() {Orientation = StackOrientation.Horizontal, Children = {buttonDisconnect, buttonConnect, buttonSend } };

        ListView lv = new ListView();
        lv.SetBinding(ListView.ItemsSourceProperty, "ListOfBarcodes");
        lv.ItemTemplate = new DataTemplate(typeof(TextCell));
        lv.ItemTemplate.SetBinding(TextCell.TextProperty, ".");

        int topPadding = 0;
        if (Device.RuntimePlatform == Device.iOS)
            topPadding = 20;

        StackLayout sl = new StackLayout { Children = { pickerBluetoothDevices, entrySleepTime, slButtons, lv }, Padding = new Thickness(0,topPadding,0,0) };
        Content = sl;
    }

Что было бы эквивалентно этому коду C# в XAML?

Я начал с чего-то вроде этого:

<?xml version="1.0" encoding="utf-8" ?>
<TabbedPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="TestBth.MyTabbedPage">
  <!--Pages can be added as references or inline-->
  <ContentPage Title="Connect">



        <ContentPage.Content>
            <StackLayout VerticalOptions="Center" HorizontalOptions="Center">

                <Picker x:Name="pickerBluetoothDevices" Title="Select a bth device"/>

                <Button x:Name="buttonConnect" Text="Connect"/>
                <Button x:Name="buttonDisconnect" Text="Disconnect"/>
                <Button x:Name="buttonSend" Text="Send"/>

                <ListView x:Name="lv"/>

            </StackLayout>

        </ContentPage.Content>

  </ContentPage>

person I. Mendoza    schedule 11.04.2018    source источник


Ответы (2)


Вы идете правильно, просто измените свойство привязки С# на свойство Xaml.

Как и для ItemSourceProperty в С#, привязка xaml ItemSource

<StackLayout VerticalOptions="Center" HorizontalOptions="Center">

            <Picker x:Name="pickerBluetoothDevices" ItemsSource="{Binding ListOfDevices}" Title="Select a bth device" SelectedItem="{Binding SelectedBthDevice}" IsEnable="{Binding IsPickerEnabled}"/>

            <Button x:Name="buttonConnect" Text="Connect" Command="{Binding ConnectCommand}"/>
            <Button x:Name="buttonDisconnect" Text="Disconnect" Command="{Binding DisconnectCommand}"/>
            <Button x:Name="buttonSend" Text="Send" Command="{Binding SendCommand}"/>

            <ListView x:Name="lv" ItemSource="{Binding ListOfBarcodes}"/>

        </StackLayout>
person Bikash    schedule 13.04.2018

по какой причине вы хотите создавать привязки в коде? Вы также можете делать привязки в коде, например, чтобы привязать команду к кнопке, вы используете:

<Button Command="{Binding ButtonCommand}"/>

в конструкторе вашего представления вам нужно установить контекст:

 public View()
  {
        InitializeComponent();
        this.BindingContext = this; // or instance of your ViewModel
  }

а также вам нужно, чтобы ваша команда была определена внутри экземпляра BindingContext:

public ICommand ButtonCommand { get; set; }
person Michał Żołnieruk    schedule 11.04.2018
comment
Я не знал, что контекст должен быть установлен там. Это было действительно полезно. Большое спасибо! - person I. Mendoza; 13.04.2018
comment
Конечно. Вы также можете сделать это внутри xaml, если хотите: forums.xamarin.com/discussion/69279/ - person Michał Żołnieruk; 13.04.2018