MVVM wpf:我如何连接以前制作的ObservableCollection和ViewModels

时间:2019-01-08 22:57:30

标签: c# wpf mvvm

在正在构建的应用程序中。我似乎遇到了一个问题,即以前插入的ObservableCollection for Categories,似乎没有从ViewModel转移到Viewmodel。

我尝试将公共类别CategoryToEdit {get;组;将其绑定到我的类型为CategoryToEdit.Type的引用 以前,这对我来说可以从另一个视图模型连接所选数据。但这是在没有mvvm的模板上发生的,我似乎无法在其上找到有效的解决方案。

这是我的MainWindowViewModel:

命名空间Webadmin.ViewModels {

  public class MainWindowViewModel

  {

    public ObservableCollection<Category> Categories { get; set; }

    public RelayCommand ChangeCategoryClick { get; set; }

    public MainWindowViewModel()
    {
        Categories = new ObservableCollection<Category>();

        ChangeCategoryClick = new RelayCommand(f => ChangeCategory(), null);

        Categories.Add(new Category() { Type = "Electronics" });
        Categories.Add(new Category() { Type = "Clothes" });
        Categories.Add(new Category() { Type = "Books" });

    }

    private void ChangeCategory()
    {        
        FilterWindow changeWindow = new FilterWindow
        {

        };          
        changeWindow.Show();
    }
}

}

此ChangeCategory只是绑定到按钮上的命令,因此它可以更改窗口。 按钮Content =“ Change” Command =“ {Binding ChangeCategoryClick}”

这是我的FilterWindowViewModel(应该显示以前填写的类型):

命名空间Webadmin.ViewModels

{

   class FilterWindowViewModel

   {        

    public ObservableCollection<Category> Categories { get; set; }

    public ICollectionView CategoryView { get; set; }

    public FilterWindowViewModel()
    {
        Categories = new ObservableCollection<Category>();

        CategoryView = CollectionViewSource.GetDefaultView(Categories);
        CategoryView.SortDescriptions.Add(new SortDescription("Type", ListSortDirection.Ascending));
    }
}

}

我尝试通过使用
在FilterWindow Datagrid中显示我的类别 DataGrid ItemsSource =“ {绑定类别}”

但是我最后得到的只是一个空表

由于应该在FilterWindowViewModel中重新创建空表,因此应该创建该空表。但是我想要拥有的是将其连接到主要填充的类别。通过这种连接,我可以添加,删除,编辑这些类别,以便绑定到这些当前类别的产品可以有更多/更少/不同的选择。

1 个答案:

答案 0 :(得分:1)

这是MVVM框架可以提供帮助的地方。例如,在MVVM Light中,Messenger的概念促进了针对此确切场景的视图模型之间的通信。前提是您触发一条消息以指示您的收藏集已更改。然后,那些感兴趣的ViewModels将注册以接收该消息。

public CategoryAddedMessage
{
    public Category AddedCategory { get; set; }
}

然后在您的MainWindowViewModel中,您需要在适当的时候触发该消息

public AddCategory(Category newCategoryToAdd)
{
    Categories.Add(newCategoryToAdd);
    Messenger.Default.Send<CategoryAddedMessage>(new CategoryAddedMessage {AddedCategory = newCategoryToAdd});
}

..然后在您的FilterWindowViewModel中,我们需要进行注册才能接收此消息并保持其收集同步:

public FilterWindowViewModel()
{
    Categories = new ObservableCollection<Category>();

    CategoryView = CollectionViewSource.GetDefaultView(Categories);
    CategoryView.SortDescriptions.Add(new SortDescription("Type", ListSortDirection.Ascending));

    Messenger.Default.Register<CategoryAddedMessage>(this, m => ReceiveCategoryAddedMessage(m));
}

,那么您的接收方法将是:

private void ReceiveCategoryAddedMessage(CategoryAddedMessage message)
{
    Categories.Add(message.AddedCategory);
}

MVVM Light还可以使用其他技术,但是希望这足以使您入门并考虑一些可能适合您的方法。