在正在构建的应用程序中。我似乎遇到了一个问题,即以前插入的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中重新创建空表,因此应该创建该空表。但是我想要拥有的是将其连接到主要填充的类别。通过这种连接,我可以添加,删除,编辑这些类别,以便绑定到这些当前类别的产品可以有更多/更少/不同的选择。
答案 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还可以使用其他技术,但是希望这足以使您入门并考虑一些可能适合您的方法。