Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 从子usercontrol datagrid行动态加载父用户控件窗体单击_Wpf_Mvvm - Fatal编程技术网

Wpf 从子usercontrol datagrid行动态加载父用户控件窗体单击

Wpf 从子usercontrol datagrid行动态加载父用户控件窗体单击,wpf,mvvm,Wpf,Mvvm,我正在为我的WPF应用程序使用mvvm模型 我在表单中有2个usercontrols 1.父级(带控件的窗体) 2.Child(Child有一个datagrid来显示从父窗体添加的行列表) 但是父窗体是动态的。表示控件不是静态的。 如果用户单击子窗体中的datagrid行,则需要动态重新加载相关的父窗体,以便进行编辑 如何使用MVVM模式实现这一点。两个控件都有自己的视图模型。 请提出解决方案。如果您使用的是Galasoft的MVVM Light,则可以使用Messenger类将更改通知您的控件

我正在为我的WPF应用程序使用mvvm模型

我在表单中有2个usercontrols 1.父级(带控件的窗体) 2.Child(Child有一个datagrid来显示从父窗体添加的行列表)

但是父窗体是动态的。表示控件不是静态的。 如果用户单击子窗体中的datagrid行,则需要动态重新加载相关的父窗体,以便进行编辑

如何使用MVVM模式实现这一点。两个控件都有自己的视图模型。
请提出解决方案。

如果您使用的是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=行;
}
}