Xamarin BindableProperty 仅在不使用 BindingContext 时才使用绑定



在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}}" />

相关内容

  • 没有找到相关文章

最新更新