C# 为什么我的属性不返回我设置的值?
我有一个简单的wpf复选框C# 为什么我的属性不返回我设置的值?,c#,wpf,properties,C#,Wpf,Properties,我有一个简单的wpf复选框 <CheckBox Name="layerCheckBox" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Grid.Column="0" /> 奇怪的是输出。首先,我选中复选框,属性设置为true。后来我看了房产,房产上写着假的?发生什么事了?它是相同的对象(哈希代码)和相同的线程。。。我不明白。。。在接下来的2次阅读中,我猜刷新,再次是真的。最好的部分是-如果我取消选中该框,它将返回true
<CheckBox Name="layerCheckBox" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Grid.Column="0" />
奇怪的是输出。首先,我选中复选框,属性设置为true。后来我看了房产,房产上写着假的?发生什么事了?它是相同的对象(哈希代码)和相同的线程。。。我不明白。。。在接下来的2次阅读中,我猜刷新,再次是真的。最好的部分是-如果我取消选中该框,它将返回true
属性中的代码来自此处
输出
SetTrue531828601
getFalse53182860thread1
GetTrue531828601
getTrue53182860thread1可能的问题是
ChangeAndNotify
扩展方法。它设置引发property changed事件后字段的值
引发事件时,所有订阅服务器都将尝试读取属性。由于尚未设置支持字段,因此它将返回原始值
修复ChangeAndNotify
扩展方法中的代码,以在引发属性更改事件之前设置字段的值
field = value; //<-- move to here
if (vmExpression != null)
{
LambdaExpression lambda = Expression.Lambda(vmExpression);
Delegate vmFunc = lambda.Compile();
object sender = vmFunc.DynamicInvoke();
if( handler != null)
{
handler(sender, new PropertyChangedEventArgs(body.Member.Name));
}
}
return true;
字段=值// 可能的问题是changeandtify
扩展方法。它设置引发property changed事件后字段的值
引发事件时,所有订阅服务器都将尝试读取属性。由于尚未设置支持字段,因此它将返回原始值
修复ChangeAndNotify
扩展方法中的代码,以在引发属性更改事件之前设置字段的值
field = value; //<-- move to here
if (vmExpression != null)
{
LambdaExpression lambda = Expression.Lambda(vmExpression);
Delegate vmFunc = lambda.Compile();
object sender = vmFunc.DynamicInvoke();
if( handler != null)
{
handler(sender, new PropertyChangedEventArgs(body.Member.Name));
}
}
return true;
字段=值// 在应用新值之前,set方法实际上会触发对“get”的调用。它之所以这样做,是因为它需要先读取IsSelected属性,然后再将其作为函数参数传递给对ChangeAndNotify的调用
我会改为:
set { PropertyChanged.ChangeAndNotify(ref _isSelected, value, () => _isSelected); }
(请注意,当作为函数参数传递时,不再调用Get属性。)在应用新值之前,set方法将实际触发对“Get”的调用。它之所以这样做,是因为它需要先读取IsSelected属性,然后再将其作为函数参数传递给对ChangeAndNotify的调用
我会改为:
set { PropertyChanged.ChangeAndNotify(ref _isSelected, value, () => _isSelected); }
(请注意,当作为函数参数传递时,您不再调用Get属性。)这就是解决方案。与其他答案相比,我更喜欢这个答案,因为在这里我只需要更改一行代码,而不需要更改大量的客户机代码。谢谢:)这就是解决办法。与其他答案相比,我更喜欢这个答案,因为在这里我只需要更改一行代码,而不需要更改大量的客户机代码。谢谢:)