2011-08-10 6 views
0

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

ビューモデルの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から現在のアイテムがnull MoveCurrentTo()によって設定された直後、およびテストによってチェックされたときに発生します。私は間違って何をしていますか?

答えて

1

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

_ticket.SelectedSubstatusが直接SubstatusList内の項目を参照していない場合は、これを回避するにはSubstatusList

に存在しない項目にSelectedSubstatus等しいを設定しようとしているためので、その後、SelectedSubstatusはNULLになります.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; 
} 
+0

あなたはそれを後に持っています。 'SelectedSubstatus'はnullではなく、ドロップダウンで選択を行うと' SelectedSubstatus'が正しく更新されます。これは意味があると思いますが、 'SubstatusList.MoveCurrentTo(_ticket.SelectedSubstatus);'は 'SubstatusList'でオブジェクトを見つけることができない場合、それを設定しません。 SubstatusListでCurrentItemを設定するにはどうすればよいですか? – Tyrsius

+0

また、サブ状態はEF4オブジェクトです。そのオーバーライドを部分クラスに配置しようとしましたが、 'ID'は有効なプロパティではありません。私はIntellisenseで働いていたものは何も見ませんでした。 – Tyrsius

+0

'SubStatus'クラスの' Equals() 'を上書きして、データが同じ場合はtrueを返します。今、メモリ内の参照が同じであればtrueを返します。 Idプロパティが例でした。 – Rachel

関連する問題