自定义控件中的 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 控件,它可以通过简单地将它放在屏幕上并设置BindablePropertiesTextCommand 等来重复使用。它可以工作,因为它默认为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 号的控件,例如: 是的,我愿意。但主要目的是在控件上设置一个 id,这是应用程序其余部分所必需的。【参考方案4】:

如果您没有绑定,则不需要 Bindable 属性,只需创建一个 int 类型的普通属性,以 ID 作为属性名称。然后您可以从 XAML 分配 ID。(Intellisense 还将显示 ID 属性)

public int ID

    get;set;

【讨论】:

好吧,它似乎也不起作用。是的,我可以通过 Intellisense 看到它,但是无论我分配什么值,该属性的值始终为零。 如果是字符串也一样,值为null

以上是关于自定义控件中的 Xamarin BindableProperty的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 将自定义控件创建为网格布局中的一行

Xamarin Forms - 在页面打开时填充自定义控件

Xamarin 自定义控件

开源 XFControls , 用于 Xamarin.Forms 的自定义控件集

Xamarin.forms 自定义dropdownview控件

Xamarin.Forms自定义用户界面控件实现一个HybridWebView(混合webview)