上下文:C#,WPF,MVVM
在我的视图模型中,我一直在对某些属性使用初始化逻辑,这基本上是检查backing属性是否为null的方法,如果是,则对其进行初始化。最后,返回后备属性。这是一个列表示例,允许用户选择要过滤的项目:
List<CBPicklistString> _clientClassificationFilterList;
public List<CBPicklistString> ClientClassificationFilterList
{
get
{
Debug.WriteLine("ClientClassificationFilterList - Get: " + _clientClassificationFilterList?.Count ?? "Null");
if (_clientClassificationFilterList == null)
{
_clientClassificationFilterList = CBPicklists.PicklistStrings(CBPicklists.CLIENT_CLASSIFICATIONS).ToList();
_clientClassificationFilterList.Insert(0, new CBPicklistString() { PicklistStringId = 0, PicklistStringValue = "(All Client Classes)" });
SelectedClientClassificationFilter = _effectiveClientClassificationFilter = _clientClassificationFilterList[0];
OnPropertyChanged("SelectedClientClassificationFilter");
}
return _clientClassificationFilterList;
}
}
我应用过滤器逻辑的方法具有以下代码:
if (_effectiveClientClassificationFilter != ClientClassificationFilterList[0])
ActiveClientFilters.Add(new ActiveFilter(_effectiveClientClassificationFilter.PicklistStringValue, "ClientClassification"));
在初始运行时,getter应该初始化列表和_effectiveClientClassificationFilter
,并且if语句应该将比较视为false(对象相等),这意味着没有要设置的活动过滤器。但是我看到的是if语句的行为好像它看到的是真(对象不相等)。当我在调试器中检查值时,它们实际上是相等的。这就好像存在一个并发问题,即在比较之前初始化没有完成。但这不是多线程的代码。 .Net(或WPF)在这里做自己的事吗?这不是进行列表初始化的有效方法吗?我在整个地方(并且已经使用了很多年)都使用了这种逻辑范例,但这是我第一次也是唯一看到这种时髦行为的地方。没有太多其他相关代码。
我想念什么?
答案 0 :(得分:1)
我不确定,但是我认为使用_effectiveClientClassificationFilter的初始值是比较中的第一个,然后计算ClientClassificationFilterList来更改_effectiveClientClassificationFilter的值,我想它不知道。因此,如果您颠倒条件的顺序,它将可以正常工作。
代替
if (_effectiveClientClassificationFilter != ClientClassificationFilterList[0])
使用
if (ClientClassificationFilterList[0] != _effectiveClientClassificationFilter)