2017-06-15 123 views
0

我有一個組合框。它將類別實例保存爲selectedItem,但是當用戶在下拉選項中未找到任何合適的類別時,他可以選擇創建新的和一個文本框出現在組合框下方,用戶可以輸入新類別的名稱現在用戶更改下拉列表,然後用戶是無法更改類別下拉列表的選擇。爲什麼表現平平?無法選擇下拉值

這裏是我的代碼: 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(); 
} 

標識將保持相同的,不會改變,因此我刪除了Name屬性的HashCode的形成方法,它只是返回Id.GetHashCode