自定义控件中的 Xamarin BindableProperty
Posted
技术标签:
【中文标题】自定义控件中的 Xamarin BindableProperty【英文标题】:Xamarin BindableProperty in custom control 【发布时间】:2018-10-21 13:27:19 【问题描述】:我在自定义控件中使用可绑定属性,以便从 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。该属性应该在构造函数中设置还是稍后设置?
我做错了什么?
【问题讨论】:
你能分享你的控件的所有代码,尤其是构造函数吗?也许您错误地设置了 BindingContext ... @EvZ 我已经更新了上面的代码。 为什么要在 CustomControl 中嵌入 ViewModel? 它不起作用,因为BindingContext
指向 MyViewViewModel
对象。如果您想让它起作用,请将BindingContext = viewModel;
更改为BindingContext = this
。顺便说一句,MyViewViewModel
字段不是必需的。我希望它有所帮助。
【参考方案1】:
为什么要在自定义控件中嵌入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();
【讨论】:
【参考方案2】:我知道为时已晚,但我已经受苦了一段时间,因为我不知道的原因 - 当您将 ContentView(自定义视图元素)设置为时,它不会绑定 BindingContext 除此以外的任何方式的财产:
<ContentView x:Class="mynamespace.CustomViews.MyView"
....
x:Name="this">
然后在主容器元素(在我的例子中是一个框架)上设置 BindingContext
<Frame BindingContext="x:Reference this"
....>
在 constructor 中设置 BindingContext - 在 MyView.xaml.cs 中 - 不起作用,而这种方式 - 以及其他方式 -将 View 绑定到另一个类(视图模型),它不会 - 我重复 - 将 ContentView 绑定到它的 code_behind.cs 文件。
【讨论】:
【参考方案3】:在你的 xaml 中,做
<controls:MyView ID="Binding Id" />
然后在 ViewModel 中,创建一个名为 Id 的属性
public int Id get; set; = 4;
【讨论】:
但是我不需要 bindableproperty... 我想做的是从 xaml 分配控件属性。我打算有几个具有不同 ID 号的控件,例如:如果您没有绑定,则不需要 Bindable 属性,只需创建一个 int 类型的普通属性,以 ID 作为属性名称。然后您可以从 XAML 分配 ID。(Intellisense 还将显示 ID 属性)
public int ID
get;set;
【讨论】:
好吧,它似乎也不起作用。是的,我可以通过 Intellisense 看到它,但是无论我分配什么值,该属性的值始终为零。 如果是字符串也一样,值为null以上是关于自定义控件中的 Xamarin BindableProperty的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms 将自定义控件创建为网格布局中的一行
开源 XFControls , 用于 Xamarin.Forms 的自定义控件集