0

在 Xamarin Forms 中,我创建了一个可绑定属性,如下所示:

public static readonly BindableProperty SelectedItemProperty = BindableProperty.Create("SelectedItem", typeof(MyItem), typeof(MyGrid), default(MyItem));

public MyItem SelectedItem
{
     get { return (MyItem)GetValue(SelectedItemProperty); }
     set { SetValue(SelectedItemProperty, value); }
}

这是我的构造函数:

public MyView()
{
     InitializeComponent();

     PropertyChanged += OnPropertyChanged;
}

protected void OnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs)
{
   if (propertyChangedEventArgs.PropertyName == "SelectedItem")
   {
       // called twice
   }
}

有人可以解释为什么属性更改事件会触发两次吗?如果我在可绑定属性的定义中创建了一个更改的处理程序,那么该处理程序将被调用一次

public static readonly BindableProperty SelectedItemProperty = BindableProperty.Create("SelectedItem", typeof(MyItem), typeof(MyGrid), default(MyItem), null, SelectedItemChanged);

我注意到这个问题只存在于代码隐藏中。如果我直接在 XAML 中设置属性,属性更改事件会触发一次

4

1 回答 1

2

我们真的没有足够的信息来肯定地回答这个问题,但我可以推测。

在没有看到您的SetValue方法的情况下,我的假设是它缺少短路,例如“如果新值和旧值相同,则不要做任何事情”。

然后我的第二个假设是绑定到此属性的控件正在设置它(在绑定之后)。SelectedItem绑定时列表类型的控件可能会发生这种情况。

由此产生的事件链可能类似于:

  1. 代码集属性
  2. 触发 PropertyChanged 事件
  3. 绑定设置控件上的值
  4. 控件报告其值已更改,双向绑定再次设置 ViewModel 上的值
  5. 缺少短路会导致再次引发 PropertyChanged 事件
  6. 绑定再次设置控件上的值(与之前的值相同)
  7. 控件不报告更改,因为它的属性已正确短路

我的猜测是,如果你要让你的 setter 短路(通过检查现有值并在它们相同时退出),这种行为将会停止。

于 2016-09-02T23:56:22.603 回答