使用数据绑定的WPF ComboBox,带有“New...”选项。

5
大家好,我有一个下拉框,它是绑定到一组元素的。但除了这些元素之外,我想再加入另一个项目,这个项目应该显示文本“新...”。我的想法是如果他们选择正常的元素之一,它将执行涉及该元素的某些操作。如果他们选择“新”元素,则会带他们到一个屏幕,让他们可以创建一个新项目。问题在于,当你数据绑定时,你不能给它添加另一个项目,而且没有添加虚拟项到元素列表中的必要性... 这是否是创建基于ComboBox的新控件的机会,它具有“DefaultElement”属性?(以及所有相关的模板和命令绑定等)
3个回答

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适当处理选择。虽然没有内置此功能的控件那么自动化,但它非常简单,很可能可以轻松地使其通用并可重用。


这似乎符合我的标准...由于你和VC的答案本质上是相同的,所以很难选择,但我会选择这个,因为它有一个例子。 - TerrorAustralis
没关系,很高兴看到你找到了答案。 - vc 74

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/zh-cn/library/system.windows.data.compositecollection(v=vs.110).aspx


很好的答案。谢谢。 - Pankaj Nikam

2
请记住,您绑定的是一个面向UI的项目集合,这可能与业务或数据实体不同。
如果我是你,我会在绑定集合的第一个位置插入一个“新”实体,并在我的视图模型中检测它,以在用户选择它时触发适当的操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接