我是WPF和MVVM的新手,非常感谢您解决以下问题:
我有一个经典的Windows-explorer类型界面,左侧窗格中有一个树视图。就像在Josh Smith的treeview示例应用程序中一样,每个treeviewitem的viewmodel都会在视图中选中时通过双向绑定进行通知。用户希望在右窗格中看到与左窗格中所选树节点相关的一些信息。为此,需要通过所选treeviewitem的viewmodel通知右窗格的viewmodel。此通知中还应包含所选节点的唯一标识符,以便右窗格视图模型可以从数据库中提取正确的信息。这个特定的viewmodel-to-viewmodel通知工作的最佳方法是什么?
浮现在脑海中的可能性是:
请指导我,实施此沟通的最佳方式是什么。
答案 0 :(得分:0)
我倾向于使用Mediator模式(例如来自MVVM Light Libs的Messenger类)来解决这个问题。
public class SelectionChangedMessage : MessageBase
{
public object SelectedItem { get; private set; }
public string Id { get; private set; }
public SelectionChangedMessage(object sender, object selectedItem, string id) : base(sender)
{
if (selectedItem == null) throw new ArgumentNullException("selectedItem");
if (id == null) throw new ArgumentNullException("id");
SelectedItem = selectedItem;
Id = id;
}
}
然后在左侧窗格中VM:
MessengerInstance.Send(new SelectionChangedMessage(this, SelectedItem, SelectedId));
在右侧窗格VM中:
MessengerInstance.Register<SelectionChangedMessage>(this, msg =>
{
//Do stuff
};
答案 1 :(得分:0)
当没有提供代码示例时,总是很难回答问题(请记住以后的问题)。事实上,我所能做的就是做出假设。因此,考虑到这一点,正如您所说的那样每个treeviewitem的viewmodel都会在视图中选择时通过双向绑定通知,我将假设您有数据绑定它到TreeViewItem.IsSelected
属性。
而不是(或同样)将TreeViewItem.IsSelected
属性绑定到绑定到TreeView.ItemsSource
的数据的集合中的单个对象视图模型的属性,您可以绑定{ {1}}属性到包含集合属性的父视图模型的属性:
TreeView.SelectedItem
这样,只要此属性发生更改,就可以为public YourObjectType SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
NotifyPropertyChanged("SelectedItem"); // must implement INPC interface
LoadObjectFromDatabase(selectedItem.Id);
}
}
方法传递所选项目的唯一LoadObjectFromDatabase
值。