Я использую привязываемое свойство в настраиваемом элементе управления, чтобы установить свойство из кода xaml. Однако похоже, что мое свойство всегда будет получать значение по умолчанию, которое я указал для привязываемого свойства.
Мой код 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. Должно ли свойство быть установлено в конструкторе или позже?
Что я делаю неправильно?
@EvZ Я обновил приведенный выше код.
Почему у вас есть ViewModel, встроенный в ваш CustomControl?
Это не работает, потому что BindingContext указывает на объект MyViewViewModel. Если вы хотите, чтобы он работал, замените BindingContext = viewModel; на BindingContext = this. Кстати, поле MyViewViewModel не обязательно. Я надеюсь, что это помогает.





В вашем xaml сделайте
<controls:MyView ID = "{Binding Id}" />
Затем в ViewModel создайте свойство с именем Id.
public int Id {get; set;} = 4;
Но тогда мне не нужно bindableproperty ... Я хочу назначить свойство элемента управления из xaml. Я намерен иметь несколько элементов управления с разными номерами идентификаторов, например: <controls: MyView ID = "4" /> и <controls: MyView ID = "5" />
Да. Но основная цель - установить идентификатор элемента управления, который необходим для остальной части приложения.
Вам не нужно свойство Bindable, если вы не привязаны, просто создайте обычное свойство типа int с идентификатором в качестве имени свойства. А затем вы можете назначить идентификатор из XAML. (Intellisense также покажет свойство ID)
public int ID
{
get;set;
}
Хорошо, похоже, тоже не работает. Да, я могу увидеть это через Intellisense, но значение свойства всегда равно нулю, независимо от того, какое значение я присваиваю.
Почему вы встраиваете 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();
}
}
Я вижу, что уже слишком поздно, но я уже некоторое время страдаю от того, что - по неизвестной мне причине - 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 файл.
Можете ли вы поделиться всем кодом вашего элемента управления и особенно конструктора? Возможно, вы неправильно установили BindingContext ...