0

WPF と MVVM パターンを使用しています。リストにバインドされているすべてのコンボボックスは正常に機能しますが、CollectionViewSourceフィルタリングに を使用するカスケード ドロップダウンがあります。セッターと同様にフィルタリングは機能しますが(回答を検索しているときに別の人が問題を抱えているのを見ました)、初期値を設定できません。いくつかの方法を試しましたが、選択した項目に影響を与えるものはないようです。

ビューモデル 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"/>

からの現在のアイテムは、CollectionViewSourceMoveCurrentTo() によって設定された直後、およびテストによってチェックされたときに null です。私は何を間違っていますか?

4

1 に答える 1

1

デフォルトでは、オブジェクトは値ではなく参照によって等しいかどうかがチェックされます。

したがって_ticket.SelectedSubstatus、 内の項目を直接参照しない場合、 に存在しない項目と等しい値を設定しようとしているためSubstatusListSelectedSubstatusは NULL になります。SelectedSubstatusSubstatusList

これを回避するには、オブジェクトのデータが同じ場合に 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 に答える