0

我正在使用 WPF 和 MVVM 模式。所有绑定到列表的组合框都可以正常工作,但我有一个使用 aCollectionViewSource进行过滤的级联下拉列表。过滤有效,setter 也有效(在搜索答案时,我看到另一个人遇到了麻烦),但我无法设置初始值。我尝试了几种方法,但似乎都没有影响所选项目。

Viewmodel ctor 和 Property setter(_ticket.SelectedSubstatus 在模型构造函数中设置):

public TicketViewModel()
    {
        _ticket = new TicketModel();
        SubstatusList = CollectionViewSource.GetDefaultView(GetStatusList());
        SubstatusList.Filter = (x) => { return (int)(x as Substatus).IST_MAIN_STATUS == (int)SelectedStatus.IST_STATUS_ID; };

        SubstatusList.MoveCurrentTo(_ticket.SelectedSubstatus);
        SelectedSubstatus = _ticket.SelectedSubstatus;

        Substatus test = (Substatus)SubstatusList.CurrentItem;

    }

public Substatus SelectedSubstatus
    {
        get { return _ticket.SelectedSubstatus; }
        set
        {
            if (value == _ticket.SelectedSubstatus ||value == null)
                return;

            _ticket.SelectedSubstatus = value;
            _ticket.Issue.IS_SUBSTATUS_ID = value.IST_SUBSTATUS_ID;

            base.OnPropertyChanged("SelectedSubstatus");
        }
    }

这是组合框 XAML

<ComboBox HorizontalAlignment="Stretch" Margin="15,0,0,0"
                                  Name="comboBox1" VerticalAlignment="Bottom" 
                                  Grid.Column="2" Grid.Row="1" FontSize="12" 
                                  IsSynchronizedWithCurrentItem="True"
                                  ItemsSource="{Binding Path=SubstatusList}" 
                                  SelectedItem="{Binding Path=SelectedSubstatus, Mode=TwoWay}" 
                                  DisplayMemberPath="IST_NAME"/>

CollectionViewSource由 MoveCurrentTo() 设置后,并且通过测试检查时,来自 的当前项为空。我究竟做错了什么?

4

1 回答 1

1

默认情况下,检查对象是否通过引用而不是值相等。

因此,如果_ticket.SelectedSubstatus不直接引用 中的项目SubstatusList,则SelectedSubstatus将为 NULL 因为您试图将SelectedSubstatus等于设置为中不存在的项目SubstatusList

为了解决这个问题,如果对象的数据相同,请覆盖返回 true的.Equals()方法。Substatus例如,

public override bool Equals(object obj)
{
      if (obj == null) return false;
      if (obj.GetType() != this.GetType()) return false;

      return this.Id == ((SubStatus)obj).Id;
 }
于 2011-08-10T15:40:26.463 回答