2010-06-09 9 views
0

Je suis nouveau dans le monde Wpf, donc j'ai créé quelques vues et tous ont au moins un ComboBox, comme j'utilise le modèle MvvM, je reçois mon auto-re-taper tout le temps le la même ligne de codes pour remplir le Combo et obtenir le SelectedItem (création de propriétés, privates pour fill et other pour obtenir).Wpf Mvvm ComboBox

Existe-t-il une sorte de cadre qui peut améliorer cette partie? ou pirater/truc ??? comme je vois trop de code répétitif ... peut-être que je fais quelque chose de mal, jetez un oeil:

XAML:

<ComboBox name= "cbDepartments" DisplayMemberPath="DepartmentName" 
         SelectedValuePath ="PrimaryKey" 
         ItemsSource="{Binding Path=Departments}" 
         SelectedItem="{Binding Path=DefaultBranch,Mode=TwoWay}" 
> 

ViewModel:

private Department defaultBranch; 
     public Department DefaultBranch 
     { 
      get 
      { 
       return this.defaultBranch; 
      } 

      set 
      { 
       if (this.defaultBranch != value) 
       { 
        this.defaultBranch = value; 
        this.OnPropertyChanged("DefaultBranch"); 
        this.saveChangeCommand.RaiseCanExecuteChanged(); 
        this.UserMessage = string.Empty; 
       } 
      } 
     } 

private ObservableCollection<Department> departments; 
public ObservableCollection<Department> Departments 
     { 
      get { return this.departments; } 
      set 
      { 
       if (this. departments!= value) 
       { 
        this. departments = value; 
        this.OnPropertyChanged("Departments"); 
       } 
      } 
     } 
+0

Est-il le même genre de ComboBox (c'est-à-dire avez-vous plusieurs comboboxes pour le département dispersé partout dans votre application?) Si c'est le cas - vous pouvez simplement faire un contrôle personnalisé qui a ce morceau de balisage et hérite de ComboBox – Goblin

+0

@Goblin, merci pour vos conseils, mais je essayé de personnaliser un contrôle dans wpf et a découvert que ce n'est pas si facile comme dans le monde de la winform ... – 2Fast4YouBR

Répondre

1

La plupart de ce que vous avez semble assez la norme. Il y a quelques choses que vous pouvez réduire:

  • Il semble que vous ne l'utilisez SelectedValue de sorte que vous pouvez supprimer SelectedValuePath
  • SelectedItem est TwoWay par défaut de sorte que vous pouvez supprimer le mode = TwoWay de cette consolidation
  • Pour la propriété departments, vous devriez pouvoir supprimer complètement le setter et ajouter et supprimer des éléments dans la collection existante. Cela peut également aider à éviter les problèmes avec les liaisons ItemsSource n'obtenant pas les notifications correctes - INotifyCollectionChanged fonctionne plus régulièrement que INotifyPropertyChanged sur la propriété de collection. Les ministères pourraient s'effondrer jusqu'à:

ObservableCollection publique < Département> Départements {get; ensemble privé; }

+0

Merci John, je ne savais pas à propos de l'INotifyColletion, je vais creuser pour savoir, acclamations. – 2Fast4YouBR

+0

ObservableCollection implémente INotifyCollectionChanged pour vous aussi longtemps que vous l'utilisez, vous recevez les notifications gratuitement lorsque l'ensemble des éléments de la collection est modifié. –

0

Comme pour faire un contrôle personnalisé pour la combobox avec les ministères - qui est vraiment facile à WPF:

<ComboBox DisplayMemberPath="DepartmentName" x:Class="...DepartmentComboBox" 
      SelectedValuePath ="PrimaryKey" 
      ItemsSource="{Binding Path=Departments}" 
      SelectedItem="{Binding Path=DefaultBranch,Mode=TwoWay}"/> 

et le code-behind:

public partial class DepartmentComboBox 
{ 
    public DepartmentComboBox() 
    { 
     InitializeComponent(); 
    } 
}