在视图模型之间传递数据的正确方法是什么?

时间:2013-01-19 08:08:42

标签: wpf mvvm viewmodel interaction

我刚开始使用MVVM,我一直在阅读它并做一些例子。我设法创建了一个应用程序,它将从数据库中读取,然后填充到列表框中。我很难尝试将所选项目链接到另一个视图,然后在该视图viewModel中进行一些处理。请有人向我解释从view1列表框中获取当前所选项目然后在view2标签上输出所选项目的正确方法吗?

这是我的XAML:

<local:SecondView Margin="499,30,0,20">
        <local:SecondView.DataContext>
            <v:MainViewModel />
        </local:SecondView.DataContext>
    </local:SecondView>
        <Button Height="22" HorizontalAlignment="Left" Margin="8,4,0,0" Name="button1" VerticalAlignment="Top" Width="48" Command="{Binding Path=GetDataCommand}">Button</Button>
    <ListBox ItemsSource="{Binding Path=FileData}"   SelectedItem="{Binding dr}"  Height="330" HorizontalAlignment="Left" Margin="149,30,0,0" Name="listBox1" VerticalAlignment="Top" Width="250" DisplayMemberPath="DDFName" />

这段代码在我的viewModel1:

private DataRowView _dr;
    public DataRowView dr
    {
        get{
            return _dr;
        }

        set
        {
            _dr = value;
            OnPropertyChanged("dr");}
    }

我想以某种方式获取viewModel2以获取dr的新值(这是在view1列表框中选择的项目),然后在view2上我想显示一些细节

提前致谢!

2 个答案:

答案 0 :(得分:3)

您的ViewModel2类取决于Row - &gt;在ViewModel2中注入依赖项的一种可能性是通过构造函数传递它。

public class ViewModel1
{
    private DataRowView _dr;
    public DataRowView dr
    {
        get
        {
            return _dr;
        }

        set
        {
            _dr = value;
            OnPropertyChanged("dr");

            this.DetailView = new ViewModel2(value); //On Change of the selected Row create a new viewModel which serves as detail view
        }
    }

    private ViewModel2 _DetailView;
    public ViewModel2 DetailView
    {
        get
        {
            return _DetailView;
        }
        set
        {
            if (_DetailView != value)
            {
                _DetailView = value;
                RaisePropertyChanged(() => this.DetailView);
            }
        }
    }
}

public class ViewModel2
{
    public ViewModel2(DataRowView row)
    {
        this.Row = row;
    }

    private DataRowView _Row;
    public DataRowView Row
    {
        get
        {
            return _Row;
        }
        set
        {
            if (_Row != value)
            {
                _Row = value;
                RaisePropertyChanged(() => this.Row);
            }
        }
    }
}

在您的XAML中,您可以将datacontext直接设置为详细信息视图:

<local:SecondView Margin="499,30,0,20" DataContext="{Binding DetailView, Mode=OneWay}" />

答案 1 :(得分:1)

你可以使用其他解决方案http://sharedprop.codeplex.com,阅读源代码是一种在对象之间共享属性的方法,如果第二个对象不活动也可以工作...只检查信息