这是我的第一个MVVM项目,我希望能够清楚 在模型中有这个:
public class Category
{
public int CategoryId { get; set; }
public string Description { get; set; }
}
在ViewModel中:
public class CategoryViewModel : MyViewModelBase
{
private ObservableCollection<Category> categories;
public ObservableCollection<Category> Categories
{
get { return categories; }
set
{
categories = value;
NotifyPropertyChanged(nameof(Categories));
}
}
}
在视图中(XAML)
这些项目绑定到ComboBox:
<ComboBox x:Name="cboCategories"
HorizontalAlignment="Left
VerticalAlignment="Top"
Width="250"
IsEditable="True"
ItemsSource="{Binding Categories}"
SelectedValuePath="CategoryId"
DisplayMemberPath="Description" />
当用户在控件上写入新条目时,有没有办法向ObservableCollection
属性添加新项(Category)?
我已经能够通过Window
显示一点TextBox
来做到这一点,但我想知道是否可以缩短此过程。
我对WPF并不熟悉,任何帮助都会受到赞赏。
答案 0 :(得分:0)
假设你有一个类别的集合,并且绑定到你的组合的itemssource 然后,您可以使用propfull将selecteditem绑定到Category类型的属性,这样您就可以使用setter来放置代码。 当该二举手开火时,您将获得一个选定的类别 然后你可以用它做你喜欢的事 一种选择是将其添加到另一个可观察的集合中。
此处描述了从列表中选择项目时的行为模式:
https://social.technet.microsoft.com/wiki/contents/articles/30564.wpf-uneventful-mvvm.aspx#Select_From_List_IndexChanged
您可以将厨师添加到DoSomethingWhenChefChanged中的另一个observablecollection。
答案 1 :(得分:0)
您可以处理TextBoxBase.TextChanged
附加事件,例如提出视图模型的命令或直接将项目添加到ObservableCollection
,例如:
private void cboCategories_TextChanged(object sender, TextChangedEventArgs e)
{
var cmb = sender as ComboBox;
var viewModel = DataContext as CategoryViewModel;
if (viewModel != null)
{
viewModel.Categories.Add(new Category() { Description = cmb.Text });
}
}
<强> XAML:强>
<ComboBox x:Name="cboCategories"
IsEditable="True"
TextBoxBase.TextChanged="cboCategories_TextChanged" ... />
如果您想使用交互式触发器调用附加的命令,您可以按照此处的建议创建自己的自定义EventTrigger
:
http://joyfulwpf.blogspot.se/2009/05/mvvm-invoking-command-on-attached-event.html