【问题标题】:Wpf Mvvm ComboBoxWpf Mvvm 组合框
【发布时间】:2010-06-09 16:10:08
【问题描述】:

我是 Wpf 世界的新手,所以我创建了几个视图,它们都至少有一个 ComboBox,因为我使用的是 MvvM 模式,所以我总是在同一行重新输入填充 Combo 并获取 SelectedItem 的代码(创建属性、用于填充的私有和其他获取)。

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

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");
                }
            }
        }

【问题讨论】:

  • 它是同一种 ComboBox(即,您的应用程序中是否有多个用于部门的组合框?)如果是这种情况 - 您可以制作一个具有该部分的自定义控件标记并从 ComboBox 继承
  • @Goblin,感谢您的建议,但我尝试在 wpf 中自定义一个控件,发现这不像 winform 的世界那么容易......

标签: wpf mvvm


【解决方案1】:

你所拥有的大部分看起来都很标准。您可以减少一些事情:

  • 您似乎没有使用 SelectedValue,因此您可以删除 SelectedValuePath
  • SelectedItem 默认为 TwoWay,因此您可以从该绑定中移除 Mode=TwoWay
  • 对于部门属性,您应该能够完全删除设置器,而是在现有集合中添加和删除项目。这也有助于避免 ItemsSource 绑定无法获得正确通知的问题 - INotifyCollectionChanged 与集合属性上的 INotifyPropertyChanged 更一致。部门可以分解为:

public ObservableCollection 部门{ get;私人套装; }

【讨论】:

  • 谢谢约翰,我不知道 INotifyColletion,我会去寻找,干杯。
  • ObservableCollection 为您实现了 INotifyCollectionChanged,只要您使用它,当集合中的项目集被修改时,您就会免费获得通知。
【解决方案2】:

至于为带有部门的组合框制作自定义控件 - 这在 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();
    }
}

【讨论】: