数据绑定WPF ComboBox与'新...'项目

时间:2010-10-26 09:02:00

标签: c# wpf data-binding combobox controls

大家好 我有一个组合框,它被数据绑定到一个元素列表。但除了那个元素列表,我想要另一个项目。此项应显示“新建...”文本 这个想法是,如果他们选择一个普通元素,它会执行一些涉及该元素的动作。如果他们选择“新建”元素,则会将他们带到可以创建新项目的屏幕 问题是,当你对某些东西进行数据处理时,你没有选择向它添加另一个项目,并且不存在将虚拟项目添加到元素列表中的问题......

这是一个基于具有'DefaultElement'属性的ComboBox创建新控件的机会吗? (包含所有相关的模板和命令绑定等)

3 个答案:

答案 0 :(得分:5)

为了做到这一点,我之前为普通类型创建了一个虚拟包装类,允许您绑定到一个主要包含正确值的列表,以及你的“新...”,例如。

public class DisplayClass
{
    public DisplayClass(ModelClass mc)
    {
         this.mc = mc;
    }

    public string Name
    {
        get { return this.mc != null ? this.mc.Name : "New..."; }
    }

    public bool IsDummy
    {
        return this.mc == null;
    }

    public ModelClass Model
    {
        return this.mc;
    }
}

然后,您可以在数据上下文(ViewModel)中托管这些集合,并根据IsDummy正确处理选择。它不像内置此功能的控件那样自动,但非常简单,可以很容易地变成通用的,因此可以重复使用。

答案 1 :(得分:3)

将ItemsSource属性设置为CompositeCollection,将新项目和绑定集合放在一起,然后根据所选索引或类似内容检测该项目的选择。

示例代码:

<ComboBox>
   <ComboBox.ItemsSource>
      <CompositeCollection>
         <ComboBoxItem>Add New Item...</ComboBoxItem>
         <CollectionContainer Collection="{Binding Source={StaticResource CollectionSource}}"/>
      </CompositeCollection>
   </ComboBox.ItemsSource>
</ComboBox>

CompositeCollection的MSDN:http://msdn.microsoft.com/en-us/library/system.windows.data.compositecollection(v=vs.110).aspx

答案 2 :(得分:2)

请记住,您绑定的是面向UI的项目集合,这些项目可能与业务或数据实体不同。

如果我是你,我会在绑定集合的第一个位置插入一个'new'实体,并在我的viewmodel中检测它,以便在用户选择它时触发相应的操作。