好吧,这听起来微不足道,甚至对我来说,但我无法找到这个问题的答案。我有一个正常的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);
}
我想这确实属于一个被接受的答案的评论,但是我没有足够的代表
请详细说明:
- 如何确保
element
与name
"添加新"留在底部。 - 如何在ViewModel中包装模型中的
Collection
,同时添加虚拟项目。
如果你在wpf中遵循绑定你必须在集合中插入项目(这里是定义)并使这个集合通知(使用INotifyPropertyChanged)那么当新项目插入时,你的ComboBox就会自动更新这不仅是一种方法,而且是最佳实践
请参阅下面的链接,了解如何实现INotifyPropertyChanged
http://wpftutorial.net/INotifyPropertyChanged.html