【问题标题】:Xamarin BindableProperty in custom control自定义控件中的 Xamarin BindableProperty
【发布时间】: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 字段不是必需的。我希望它有所帮助。

标签: c# xaml xamarin xamarin.forms


【解决方案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
      猜你喜欢
      • 2020-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-09
      • 1970-01-01
      • 2018-03-03
      • 1970-01-01
      相关资源
      最近更新 更多