Установите начальное значение в Combobox, привязанное к CollectionViewSource - PullRequest
0 голосов
/ 10 августа 2011

Я использую WPF и шаблон MVVM.Все комбинированные списки, которые связаны со списками, работают нормально, но у меня есть каскадный выпадающий список, который использует CollectionViewSource для фильтрации.Фильтрация работает так же, как и сеттер (который во время поиска ответа видел другого человека, у которого были проблемы), но я не могу установить начальное значение.Я пробовал несколько методов, но ни один из них не влияет на выбранный элемент.

Viewmodel ctor и установщик свойства (_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 (), и при проверке тестом.Что я делаю не так?

1 Ответ

1 голос
/ 10 августа 2011

По умолчанию объекты проверяются, если они равны по ссылке, а не по значению.

Так что если _ticket.SelectedSubstatus не ссылается непосредственно на элемент в SubstatusList, то SelectedSubstatus будет иметь значение NULL, потому что вы пытаетесь установить SelectedSubstatus равным элементу, который не существует в SubstatusList

Чтобы обойти это, переписать метод .Equals() Substatus, чтобы вернуть true, если данные объекта совпадают. Например,

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

      return this.Id == ((SubStatus)obj).Id;
 }
...