Wpf 从子usercontrol datagrid行动态加载父用户控件窗体单击
我正在为我的WPF应用程序使用mvvm模型 我在表单中有2个usercontrols 1.父级(带控件的窗体) 2.Child(Child有一个datagrid来显示从父窗体添加的行列表) 但是父窗体是动态的。表示控件不是静态的。 如果用户单击子窗体中的datagrid行,则需要动态重新加载相关的父窗体,以便进行编辑 如何使用MVVM模式实现这一点。两个控件都有自己的视图模型。Wpf 从子usercontrol datagrid行动态加载父用户控件窗体单击,wpf,mvvm,Wpf,Mvvm,我正在为我的WPF应用程序使用mvvm模型 我在表单中有2个usercontrols 1.父级(带控件的窗体) 2.Child(Child有一个datagrid来显示从父窗体添加的行列表) 但是父窗体是动态的。表示控件不是静态的。 如果用户单击子窗体中的datagrid行,则需要动态重新加载相关的父窗体,以便进行编辑 如何使用MVVM模式实现这一点。两个控件都有自己的视图模型。 请提出解决方案。如果您使用的是Galasoft的MVVM Light,则可以使用Messenger类将更改通知您的控件
请提出解决方案。如果您使用的是Galasoft的MVVM Light,则可以使用Messenger类将更改通知您的控件父控件。我在我的项目中使用了这个,效果非常好 我相信还有其他的消息框架,你只需要用谷歌搜索就可以了
如果您使用的是Galasoft的MVVM Light,则可以使用Messenger类将更改通知您的控件父控件。我在我的项目中使用了这个,效果非常好 我相信还有其他的消息框架,你只需要用谷歌搜索就可以了
您应该实现并使用来简化
控件之间的绑定
您应该实现并使用来简化控件之间的绑定
父视图模型需要侦听子行上的选择更改事件。下面的示例应该解释我的想法:
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;
}
}
内部类ParentViewModel
{
private ChildViewModel_child;
公共父视图模型(子视图模型子视图)
{
_孩子=孩子;
_child.SelectedChildRowChanged+=新事件处理程序(OnChild\u SelectedChildRowChanged);
}
选择Child_时无效ChildRowChanged(对象发送方,ChildRowChangedEventArgs e)
{
//在这里做你的动态工作
}
}
内部类ChildViewModel
{
私有可观察收集行;
公共ListCollectionView行视图{get;set;}
公共事件事件处理程序SelectedChildRowChanged;
公共子视图模型(IList行)
{
_行=新的可观察集合(行);
RowView=新建ListCollectionView(_行);
RowView.CurrentChanged+=新事件处理程序(OnRowView\u CurrentChanged);
}
void OnRowView\u CurrentChanged(对象发送方,事件参数e)
{
如果(SelectedChildRowChanged!=null)
{
SelectedChildRowChanged(此,新的ChildRowChangedEventArgs(RowView.CurrentItem作为ChildRowViewModel));
}
}
}
内部类ChildRowViewModel
{
}
内部类ChildRowChangedEventArgs:EventArgs
{
public ChildRowViewModel行{get;private set;}
公共ChildRowChangedEventArgs(ChildRowViewModel行)
{
this.Row=行;
}
}
父视图模型需要侦听子行上的选择更改事件。下面的示例应该解释我的想法:
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;
}
}
内部类ParentViewModel
{
private ChildViewModel_child;
公共父视图模型(子视图模型子视图)
{
_孩子=孩子;
_child.SelectedChildRowChanged+=新事件处理程序(OnChild\u SelectedChildRowChanged);
}
选择Child_时无效ChildRowChanged(对象发送方,ChildRowChangedEventArgs e)
{
//在这里做你的动态工作
}
}
内部类ChildViewModel
{
私有可观察收集行;
公共ListCollectionView行视图{get;set;}
公共事件事件处理程序SelectedChildRowChanged;
公共子视图模型(IList行)
{
_行=新的可观察集合(行);
RowView=新建ListCollectionView(_行);
RowView.CurrentChanged+=新事件处理程序(OnRowView\u CurrentChanged);
}
void OnRowView\u CurrentChanged(对象发送方,事件参数e)
{
如果(SelectedChildRowChanged!=null)
{
SelectedChildRowChanged(此,新的ChildRowChangedEventArgs(RowView.CurrentItem作为ChildRowViewModel));
}
}
}
内部类ChildRowViewModel
{
}
内部类ChildRowChangedEventArgs:EventArgs
{
public ChildRowViewModel行{get;private set;}
公共ChildRowChangedEventArgs(ChildRowViewModel行)
{
this.Row=行;
}
}