在Xamarin Forms中,我创建了一个包含自定义组件的页面,我想为它提供一个值,就像这样:
<c:CustomComponent Test="{Binding Test}" />
然而,这不起作用。当我使用原始数字而不是绑定时,它可以工作。我发现的问题是,我的自定义组件使用了ViewModel/BindingContext。因此,当我删除我将ViewModel分配给BindingContext的行时,绑定工作了。
为什么会这样,我如何使用两者,BindingContext和BindableProperty在我的自定义组件?还是我必须在代码后面做所有的事情?
作为参考,一些代码示例如何创建BindableProperty
public static readonly BindableProperty TestProperty = BindableProperty.Create(nameof(Test), typeof(int),
typeof(CustomComponent), propertyChanged: (bindable, oldVal, newVal) => {
Debug.WriteLine("TEST " + newVal);
});
public int Test {
get => (int)GetValue(TestProperty);
set => SetValue(TestProperty, value);
}
我的自定义组件使用了ViewModel/BindingContext.">
创建一个可重用的自定义组件更容易,如果它是"自包含"的;- no BindingContext.
构造函数:
public CustomComponent()
{
InitializeComponent();
}
将当前组件视图模型中的所有内容移到xml .cs文件后面的代码中。
现在在CustomComponent。xaml,给它一个名字(这里是theComponent
):
<ContentView ...
x:Name="theComponent"
x:Class=...>
当组件的xaml想要绑定到自己的属性时,这很方便:
<Label Text="{Binding TestString, Source={x:Reference theComponent}}" />
public string TestString
{
get => _testString;
set {
_testString = value;
OnPropertyChanged();
}
}
private string _testString = "test";
tl;博士:如果组件的xaml中有x:Name="theComponent"
,则可以使用{Binding ..., Source={x:Reference theComponent}}
来引用自己的属性。No BindingContext .
如果你想让组件有一个关联的ViewModel,使用上面的技术,你不必为那个VM设置BindingContext。这样做:
public class MyViewModel
{
public string TestString
{
get => _testString;
set {
_testString = value;
OnPropertyChanged();
}
}
private string _testString = "test";
}
CustomComponent:
public MyViewModel VM { get; private set; }
public CustomComponent()
{
InitializeComponent();
VM = new MyViewModel();
}
在xaml中的用法:
<Label Text="{Binding VM.TestString, Source={x:Reference theComponent}}" />