Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的属性不返回我设置的值?_C#_Wpf_Properties - Fatal编程技术网

C# 为什么我的属性不返回我设置的值?

C# 为什么我的属性不返回我设置的值?,c#,wpf,properties,C#,Wpf,Properties,我有一个简单的wpf复选框 <CheckBox Name="layerCheckBox" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}" Grid.Column="0" /> 奇怪的是输出。首先,我选中复选框,属性设置为true。后来我看了房产,房产上写着假的?发生什么事了?它是相同的对象(哈希代码)和相同的线程。。。我不明白。。。在接下来的2次阅读中,我猜刷新,再次是真的。最好的部分是-如果我取消选中该框,它将返回true

我有一个简单的wpf复选框

 <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属性。)

这就是解决方案。与其他答案相比,我更喜欢这个答案,因为在这里我只需要更改一行代码,而不需要更改大量的客户机代码。谢谢:)这就是解决办法。与其他答案相比,我更喜欢这个答案,因为在这里我只需要更改一行代码,而不需要更改大量的客户机代码。谢谢:)