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

时间:2012-01-11 10:11:56

标签: wpf mvvm

我在我的WPF应用程序中使用mvvm模型。

我在表单中有2个用户控件 1.家长(带控件的表格) 2.子(子项具有数据网格,以显示从父表单添加的行列表)

但父表单是动态的。意味着控制不是静态的。 如果用户点击child中的datagrid行,我需要动态重新加载相关的父表单。

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

3 个答案:

答案 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类通知您的控件父级有关更改。我在我的项目中使用了它,就像一个魅力。

我确信还有其他消息传递框架,你只需要谷歌它。 ;)

Galasoft MVVM

答案 2 :(得分:0)

您应该实施INotifyPropertyChanged并使用Data Context Proxy来简化Controls之间的绑定。