在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中设置属性,则属性更改事件将触发一次。
答案 0 :(得分:2)
我们确实没有足够的信息可以肯定地回答这个问题,但我可以推测。
如果没有看到您的SetValue
方法,我的假设就是它没有短路,例如:如果新值和旧值相同,则不要做任何事情"
然后我的第二个假设是绑定到此属性的控件正在设置它(绑定后)。绑定SelectedItem
时,列表类型控件可能会发生这种情况。
由此产生的事件链可能类似于:
我的猜测是,如果你要将你的二传手短路(通过检查现有值并挽救它们是否相同),这种行为就会停止。