2010-06-09 155 views
0

我是Wpf世界的新手,所以我创建了几个视图,它们都有至少一个ComboBox,因为我使用的是MvvM模式,所以我一直在重新输入相同的代码行来填充组合,并获得SelectedItem(创建属性,私人和其他获得)。Wpf Mvvm组合框

是否有某种框架可以改进这部分?或破解/技巧?因为我看到太多重复的代码......也许是我做错了什么,一起来看看:

XAML:

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

视图模型:

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

它是同类ComboBox(也就是说,你是否有多个组合框分散在整个应用程序中?)如果是这样的话 - 你可以制作一个自定义控件,该组件具有这种标记并继承自ComboBox – Goblin 2010-06-09 19:55:14

+0

@Goblin,感谢您的建议,但是我试图在wpf中自定义一个控件,发现并不像在winform的世界中那么容易... – 2Fast4YouBR 2010-06-10 14:36:10

回答

1

大多数的你有什么小艾标准。有几件事情,你可以砍掉:

  • 它看起来像您不使用的SelectedValue这样可以去掉SelectedValuePath
  • 的SelectedItem是双向默认情况下,这样你就可以从结合
  • 删除模式=双向
  • 对于部门属性,您应该可以完全移除设置器,而是添加和移除现有集合中的项目。这也可以帮助避免ItemsSource绑定无法获得正确通知的问题 - INotifyCollectionChanged在集合属性上工作得更加一致,即INotifyPropertyChanged。部门可以向下折叠至:

公众的ObservableCollection <部>部门{获得;私人设置; }

+0

谢谢约翰,我不知道INotifyColletion,我会挖掘以找出答案,欢呼。 – 2Fast4YouBR 2010-06-10 14:38:44

+0

ObservableCollection为你实现了INotifyCollectionChanged,所以只要你使用它,你可以在集合中的项目集被修改时免费得到通知。 – 2010-06-10 22:15:03

0

,作为使与部门的组合框的自定义控制 - 这是很容易在WPF:

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

和代码隐藏:

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