将"Add new"项添加到组合框



好吧,这听起来微不足道,甚至对我来说,但我无法找到这个问题的答案。我有一个正常的ComboBox,它工作得很好。

我想做的是添加一个element (作为drop-down list的最后一个项目),这只是一个添加新的 label;当这个项目被选中时,我想打开一个窗口,允许我定义我要添加的element的属性。

现在我有以下内容:

<ComboBox x:Name="myCombo"
    SelectedValue="{Binding Name, UpdateSourceTrigger=PropertyChanged}"
    ItemsSource="{Binding Definitions}" 
    SelectedValuePath="Name"
    DisplayMemberPath="Name"
    SelectionChanged="CheckToAdd" />

CheckToAdd函数是这样的:

private void CheckToAdd(object sender, SelectionChangedEventArgs e)
{
    if (((myViewModel)e.AddedItems[0]).Name.Value.Equals("Add new"))
    {
        AddNewItem(sender, null);
    }
}

我所做的是在我的Definitions中有一个dummy element,其中添加新的作为Name。使用这种方法使所有工作,但它是丑陋的IMO (因为问题只是一个view的事情,所以我不认为这是正确的与VM or the Model混淆)

谁有更好的主意?

没有ASP的等效。. NET的AppendDataBoundItems用于WPF。你可以通过修改ControlTemplate得到一些东西,或者你可以简化你当前的方法使它更容易读。比如:

private void CheckToAdd(object sender, SelectionChangedEventArgs e) {
    if (cbo.SelectedIndex == Definitions.Count()) {
        AddNewItem(sender, null);
    }

我想这确实属于一个被接受的答案的评论,但是我没有足够的代表

请详细说明:

  1. 如何确保elementname"添加新"留在底部。
  2. 如何在ViewModel中包装模型中的Collection,同时添加虚拟项目。

如果你在wpf中遵循绑定你必须在集合中插入项目(这里是定义)并使这个集合通知(使用INotifyPropertyChanged)那么当新项目插入时,你的ComboBox就会自动更新这不仅是一种方法,而且是最佳实践

请参阅下面的链接,了解如何实现INotifyPropertyChanged

http://wpftutorial.net/INotifyPropertyChanged.html

最新更新