Xamarin BindableProperty в пользовательском контроле - PullRequest
0 голосов
/ 11 мая 2018

Я использую привязываемое свойство в пользовательском элементе управления, чтобы установить свойство из кода xaml. Однако, похоже, что мое свойство всегда получит значение по умолчанию, которое я указал для свойства bindable.

Мой код xaml:

<controls:MyView ID="4" />

Мой код:

public partial class MyView : ContentView
{
    public static readonly BindableProperty IDProperty = BindableProperty.Create(
                                    nameof(ID),
                                    typeof(int),
                                    typeof(MyView),
                                    15);
    public int ID
    {
        get
        {
             return (int)GetValue(IDProperty);
        }
        set
        {
            SetValue(IDProperty, value);
        }
    }

    private MyViewViewModel viewModel;

    public MyView()
    {
        InitializeComponent();
        viewModel = new MyViewViewModel() {};
        BindingContext = viewModel; 
    }
}

Я ожидаю, что мое свойство должно получить значение 4 в этом примере, но оно всегда получит значение по умолчанию 15. Должно ли свойство быть установлено в конструкторе или позже?

Что я делаю не так?

Ответы [ 4 ]

0 голосов
/ 14 октября 2018

Я вижу, что уже слишком поздно, но я уже некоторое время мучаюсь, что - по неизвестной мне причине - ContentView (элемент пользовательского представления) не будет привязываться при установке BindingContext свойство любым другим способом:

<ContentView x:Class="mynamespace.CustomViews.MyView"
....
 x:Name="this">

затем на главном элементе контейнера (в моем случае это фрейм) установите BindingContext

<Frame BindingContext="{x:Reference this}"
....>

Установка BindingContext в конструкторе - в MyView.xaml.cs - не работает, в то время как этот и другие способы работают в связывании Представление в другом классе (главным образом, в ViewModel), он не повторяется, я повторяю, связывает ContentView с его файлом codeBehind.cs.

0 голосов
/ 11 мая 2018

Вам не нужно свойство Bindable, если оно не является обязательным, просто создайте свойство Normal типа int с ID в качестве имени свойства. И затем вы можете назначить идентификатор из XAML. (Intellisense также покажет свойство ID)

public int ID
{
    get;set;
}
0 голосов
/ 11 мая 2018

Почему вы вставляете ViewModel в свой пользовательский элемент управления?

Это странно и даже неправильно. Идея пользовательского элемента управления заключается в том, что вы можете повторно использовать его и связать с родительским ViewModel. Подумайте о простом элементе управления Button, его можно использовать повторно, просто поместив его на экран и установив BindableProperties, например Text, Command и т. Д. Он работает, потому что по умолчанию он BindingContext такой же, как это родитель.

В вашем случае вы как бы изолируете свой элемент управления от любых модификаций, поскольку вы устанавливаете BindingContext в закрытый пользовательский класс ViewModel. Вы должны пересмотреть свое решение.

Это должно быть так просто:

public partial class MyView : ContentView
{
    public static readonly BindableProperty IDProperty = BindableProperty.Create(
                                    nameof(ID),
                                    typeof(int),
                                    typeof(MyView),
                                    15);
    public int ID
    {
        get => (int)GetValue(IDProperty);
        set => SetValue(IDProperty, value);
    }

    public MyView()
    {
        InitializeComponent();
    }
}
0 голосов
/ 11 мая 2018

В тебе xaml, делай

<controls:MyView ID="{Binding Id}" />

А затем во ViewModel создайте объект с именем Id

.
public int Id {get; set;} = 4;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...