为可绑定属性调用OnPropertyChanged两次

时间:2016-09-02 22:49:55

标签: xaml xamarin xamarin.forms bindable

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

如果没有看到您的SetValue方法,我的假设就是它没有短路,例如:如果新值和旧值相同,则不要做任何事情"

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

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

  1. 代码设置属性
  2. 触发PropertyChanged事件
  3. 绑定设置控件上的值
  4. 控制报告其值已更改,双向绑定再次设置ViewModel上的值
  5. 缺少短路会导致PropertyChanged事件再次被提升
  6. 绑定再次设置控件上的值(与之前的值相同)
  7. 控件未报告更改,因为它的属性已正确短路
  8. 我的猜测是,如果你要将你的二传手短路(通过检查现有值并挽救它们是否相同),这种行为就会停止。