2017-06-15 31 views
0

私はコンボボックスを持っています。これはカテゴリインスタンスをselectedItemとして保持しますが、ユーザーがドロップダウンオプションで適切なカテゴリを見つけられなかった場合、新規作成を選択でき、コンボボックスの下に1つのテキストボックスが表示され、ユーザーが新しいカテゴリの名前を入力できるようになりました。カテゴリのドロップダウンの選択を変更することはできません。なぜ行動するのか?ここでドロップダウン値を選択できません

は私のコードです: MainWindow.xaml

<StackPanel> 
    <TextBlock Text="{Binding Name, Mode=TwoWay}"></TextBlock> 
    <ComboBox x:Name="Category" ItemsSource="{Binding Categories}" DisplayMemberPath="Name" 
       SelectedItem="{Binding Menu.Category, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"/> 
    <TextBox Text="{Binding Menu.Category.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"> 
     <TextBox.Style> 
      <Style> 
       <Setter Property="TextBox.Visibility" Value="Collapsed"></Setter> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=Category, Path=SelectedItem.Id}" Value="-1"> 
         <Setter Property="TextBox.Visibility" Value="Visible"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </TextBox.Style> 
    </TextBox> 
</StackPanel> 

MainViewModel.cs

public class MainViewModel : ViewModelBase 
{ 
    public MainViewModel() 
    { 

     Name = "Jenish"; 
     Categories = new ObservableCollection<Category>(); 
     Categories.Add(new Category(){ Id = -1, Name = "Create New"}); 
     Categories.Add(new Category() { Id = 1, Name = "Test1" }); 
     Categories.Add(new Category() { Id = 2, Name = "Test2" }); 
     Menu = new Menu(); 
    } 

    private string _name; 
    public string Name 
    { 
     get { return _name; } 
     set 
     { 
      _name = value; 
      RaisePropertyChanged(() => Name); 
     } 
    } 

    private ObservableCollection<Category> _categories; 
    public ObservableCollection<Category> Categories 
    { 
     get { return _categories; } 
     set 
     { 
      _categories = value; 
      RaisePropertyChanged(() => Categories); 
     } 
    } 

    private Menu _menu; 
    public Menu Menu 
    { 
     get { return _menu; } 
     set 
     { 
      _menu = value; 
      RaisePropertyChanged(() => Menu); 
     } 
    } 
} 

Menu.cs

public class Menu : ViewModelBase 
{ 
    private int _id; 
    public int Id 
    { 
     get => _id; 
     set 
     { 
      _id = value; 
      RaisePropertyChanged(() => Id); 
     } 
    } 

    private Category _category; 

    public Category Category 
    { 
     get => _category; 
     set 
     { 
      _category = value; 
      RaisePropertyChanged(() => Category); 
     } 
    } 
} 

Category.cs

public class Category : ViewModelBase 
{ 
    private int _Id; 
    public int Id 
    { 
     get => _Id; 
     set 
     { 
      _Id = value; 
      RaisePropertyChanged(() => Id); 
     } 
    } 

    private string _name; 
    public string Name 
    { 
     get => _name; 
     set 
     { 
      _name = value; 
      RaisePropertyChanged(() => Name); 
     } 
    } 

    public override int GetHashCode() 
    { 
     return Id.GetHashCode() & Name.GetHashCode();//for reference type binding to the selectedItem in the combobox 
    } 
} 

この問題は、カテゴリで[新規作成]を選択してテキストボックスのテキストを変更した場合にのみ発生します。テキストボックスに新規作成というテキストを再度入力すると、ユーザーは再びコンボボックスの選択を変更できます。

ここで、私は選択を変更できません。 enter image description here

答えて

0

長い時間の研究とデバッグの後、ユーザーがコンボボックスの選択を変更したときに私はそれを知りました。フレームワークはSelectedItemプロパティにバインドされているオブジェクトのEqualsとGetHashCodeを呼び出します。

このコードの悪い点は、GetHashCodeメソッドを非常に慎重にオーバーライドする必要があり、そのメソッドは変更可能なプロパティまたはフィールドに依存しないことです。だから、変更を、私は以下のようにGetHashCodeの実装を変更し、それが働いた... :)

public override int GetHashCode() 
{ 
    return Id.GetHashCode(); 
} 

Idは同じままと文句を言わないので、私はこの方法を形成Nameプロパティのハッシュコードを削除し、それだけでId.GetHashCodeを返します。

関連する問題