属性初始化和比较时间

时间:2018-06-22 01:40:05

标签: c# wpf mvvm viewmodel

上下文: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)在这里做自己的事吗?这不是进行列表初始化的有效方法吗?我在整个地方(并且已经使用了很多年)都使用了这种逻辑范例,但这是我第一次也是唯一看到这种时髦行为的地方。没有太多其他相关代码。

我想念什么?

1 个答案:

答案 0 :(得分:1)

我不确定,但是我认为使用_effectiveClientClassificationFilter的初始值是比较中的第一个,然后计算ClientClassificationFilterList来更改_effectiveClientClassificationFilter的值,我想它不知道。因此,如果您颠倒条件的顺序,它将可以正常工作。

代替

if (_effectiveClientClassificationFilter != ClientClassificationFilterList[0])

使用

if (ClientClassificationFilterList[0] != _effectiveClientClassificationFilter)