我在我的WPF应用程序中使用mvvm模型。
我在表单中有2个用户控件 1.家长(带控件的表格) 2.子(子项具有数据网格,以显示从父表单添加的行列表)
但父表单是动态的。意味着控制不是静态的。 如果用户点击child中的datagrid行,我需要动态重新加载相关的父表单。
如何使用MVVM模式实现此目的。两个控件都有自己的视图模型。 请提出解决方案。
答案 0 :(得分:2)
父ViewModel需要侦听子行上的选择更改事件。下面的示例应该解释我的想法:
internal class ParentViewModel
{
private ChildViewModel _child;
public ParentViewModel(ChildViewModel child)
{
_child = child;
_child.SelectedChildRowChanged += new EventHandler<ChildRowChangedEventArgs>(OnChild_SelectedChildRowChanged);
}
void OnChild_SelectedChildRowChanged(object sender, ChildRowChangedEventArgs e)
{
// do your dynamic stuff here
}
}
internal class ChildViewModel
{
private ObservableCollection<ChildRowViewModel> _rows;
public ListCollectionView RowView { get; set; }
public event EventHandler<ChildRowChangedEventArgs> SelectedChildRowChanged;
public ChildViewModel(IList<ChildRowViewModel> rows)
{
_rows = new ObservableCollection<ChildRowViewModel>(rows);
RowView = new ListCollectionView(_rows);
RowView.CurrentChanged += new EventHandler(OnRowView_CurrentChanged);
}
void OnRowView_CurrentChanged(object sender, EventArgs e)
{
if (SelectedChildRowChanged != null)
{
SelectedChildRowChanged(this, new ChildRowChangedEventArgs(RowView.CurrentItem as ChildRowViewModel));
}
}
}
internal class ChildRowViewModel
{
}
internal class ChildRowChangedEventArgs : EventArgs
{
public ChildRowViewModel Row {get; private set;}
public ChildRowChangedEventArgs(ChildRowViewModel row)
{
this.Row = row;
}
}
答案 1 :(得分:1)
如果您正在使用Galasoft的MVVM Light,那么您可以使用Messenger类通知您的控件父级有关更改。我在我的项目中使用了它,就像一个魅力。
我确信还有其他消息传递框架,你只需要谷歌它。 ;)
答案 2 :(得分:0)
您应该实施INotifyPropertyChanged
并使用Data Context Proxy来简化Controls
之间的绑定。