如何从列表控件向ViewModel ObservableCollection属性添加项? WPF MVVM

时间:2018-05-03 19:31:48

标签: c# wpf mvvm observablecollection

这是我的第一个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并不熟悉,任何帮助都会受到赞赏。

2 个答案:

答案 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

https://social.msdn.microsoft.com/Forums/vstudio/en-US/c3e9fad4-16ee-4744-8b0e-1ea0abfc5da7/how-to-handle-scrollviewerscrollchanged-event-in-mvvm?forum=wpf