【问题标题】:Should I bind to Properties of my control, or should I update them in OnPropertyChanged?我应该绑定到我的控件的属性,还是应该在 OnPropertyChanged 中更新它们?
【发布时间】:2021-12-31 13:26:18
【问题描述】:

假设我有ControlA,在代码隐藏中我有一些属性PropertyA,它们是可绑定属性的实例属性。我想将它们的值传递给在 XAML 中声明的控制 ControlB 中的 PropertyB

现在我可以像这样绑定到属性:

<ContentView
  ...
  x:Name="Self">

  <ContentView.Content>
    <ControlB
      x:Name="ConB"
      PropertyB="{Binding Source={x:Reference Self}, Path=PropertyA}/>
  </ContentView.Content>
</ContentView>

或者在后面的代码中这样:

protected override void OnPropertyChanged(string propertyName = null)
{
  if(propertyName == nameof(PropertyA)
  {
    ConB.PropertyB = PropertyA;
  }
}

其中一种方法比另一种更好吗?

【问题讨论】:

  • 好吧,当您在 XAML 中绑定它们时,绑定代码会在后台自动生成。每年编写一次有什么好处?
  • 看看网上的代码示例和教程——我想说很多,因为很多人告诉别人手写。我想知道它是否有一些意义。
  • 顺便说一句,我 总是 有一个用于控件的 (view-)model 类,因此我在 XAML 中绑定到该类 - 在您的示例中我没有看到任何模型类跨度>
  • (FWIW @SirRufo - 我以前总是有一个 ViewModel。但有时这会增加复杂性/编码,但没有足够的好处。最近我一直在尝试将该代码放在第二个 partial class 文件中. 所以它的一部分代码在后面,但通过在另一个文件中进行物理分离。)
  • 我更喜欢第一种情况。原因:将代码放在适用的地方,而不是需要if ... elseif ... 的集中位置。这会变得混乱。如果您正在查看ControlB,您不会意识到您还需要查看OnPropertyChanged 方法,以了解影响它的因素。我唯一会考虑的情况是,如果它是一个难以用 XAML 编写的表达式。例如,如果它取决于其他条件。 if (someSpecialFlag &amp;&amp; ... nameof(PropertyA)).

标签: c# xaml xamarin.forms


【解决方案1】:

我更喜欢第一种情况。

原因:将代码放在适用的地方,而不是放在需要的集中位置

if ... elseif ...

这会变得一团糟。

如果您正在查看XAMLControlB,没有迹象表明您还需要查看cs 文件,OnPropertyChanged 方法,以了解影响它的因素。


我唯一会考虑的情况是,如果它是一个难以用XAML 编写的表达式。例如,如果它依赖于其他条件:

if (someSpecialFlag && ... nameof(PropertyA)) ...

在这种情况下,我会在 cs 代码隐藏文件的顶部放置一个醒目的注释,提醒任何需要维护代码的人 OnPropertyChanged 中做了一些特别的事情。


它也值得研究Triggers,作为在XAML 中表示条件的一种方式。

【讨论】:

    猜你喜欢
    • 2011-09-13
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-06-24
    • 2020-09-28
    • 2022-08-15
    • 2013-06-26
    相关资源
    最近更新 更多