2017-06-15 3 views
0

Ich habe eine Combobox. Es hält die Kategorie-Instanz als selectedItem, aber wenn Benutzer keine passende Kategorie in der Dropdown-Option gefunden hat, kann er neue erstellen auswählen und ein Textfeld erscheint in der Combobox und der Benutzer kann den Namen der neuen Kategorie eingeben, der Benutzer ändert das Dropdown und dann der Benutzer nicht in der Lage, die Auswahl der Dropdown-Kategorie zu ändern. Warum verhält sich strage?Dropdown-Wert kann nicht ausgewählt werden

Hier ist mein Code: 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 
    } 
} 

Dieses Problem tritt nur auf, wenn der Benutzer in der Kategorie Neu erstellen ausgewählt und den Textfeldtext geändert hat. Wenn der Benutzer den Text wieder als Create New in das Textfeld einfügt, kann der Benutzer die Auswahl der Combobox erneut ändern.

Siehe Bild unten, wo ich die Auswahl nicht ändern kann.

Antwort

0

Nach einer langen Zeit der Forschung und Debugging kam ich zu wissen, dass, wenn Benutzer die Auswahl der Combobox ändert. Framework ruft Equals und GetHashCode für das Objekt auf, das an die SelectedItem-Eigenschaft gebunden ist.

Schlechte Sache über diesen Code ist, dass wir die GetHashCode Methode sehr sorgfältig überschreiben sollten und diese Methode nicht von den veränderbaren Eigenschaften oder Feldern abhängen sollte. Also änderte ich Umsetzung von GetHashCode wie unten und es hat funktioniert ... :)

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

Id wird gleich bleiben und wird nicht ändern, so entfernte ich die Name Eigenschaft HashCode des Verfahrens bilden und es gibt nur die Id.GetHashCode.

Verwandte Themen