我是WPF和MVVM的新手,希望在以下问题上提供帮助:
我有一个经典的windows-explorer类型接口,左侧窗格中有一个treeview。就像在Josh Smith的treeview示例应用程序中一样,只要在视图中选择每个treeviewitem的视图模型,就会通过双向绑定通知它。用户希望在右侧窗格中看到与左侧窗格中选定的树节点相关的一些信息。要做到这一点,右侧窗格的视图模型需要由所选treeviewitem的视图模型通知。此通知中还应包括所选节点的唯一标识符,以便右窗格视图模型可以从数据库中提取正确的信息。这个特定的视图模型到视图模型通知的最佳工作方式是什么?
出现在脑海中的可能性是:
请指导我,什么是最好的方式来实现这一沟通。
发布于 2013-10-24 08:38:16
对于这样的问题,我倾向于使用Mediator模式(例如中的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
};发布于 2013-10-24 08:38:50
当没有提供代码示例时,回答问题总是很困难的(请记住这一点,以备以后的问题使用)。事实上,我所能做的就是做一些假设。因此,考虑到这一点,正如您已经说过的,每个treeviewitem的视图模型是通过双向绑定通知的,只要它在视图中被选中,我将假设您已经将其绑定到TreeViewItem.IsSelected属性。
与将TreeViewItem.IsSelected属性绑定到集合中绑定到TreeView.ItemsSource的单个对象视图模型的属性不同,您可以将TreeView.SelectedItem属性绑定到包含集合属性的父视图模型的属性:
public YourObjectType SelectedItem
{
get { return selectedItem; }
set
{
selectedItem = value;
NotifyPropertyChanged("SelectedItem"); // must implement INPC interface
LoadObjectFromDatabase(selectedItem.Id);
}
}这样,每当此属性发生更改时,就可以传递所选项的唯一Id值。
https://stackoverflow.com/questions/19559011
复制相似问题