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

4
我刚开始学习MVVM,并阅读了一些资料并进行了一些实例。我已经成功创建了一个应用程序,可以从数据库中读取数据并填充到列表框中。但是我在尝试将所选项目链接到另一个视图并在该视图的viewModel中进行一些处理时遇到了困难。请问有人能够解释一下如何正确地获取视图1列表框中当前选择的项目,然后在视图2标签中输出所选项目吗?
以下是我的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个回答

3

您的ViewModel2类依赖于Row——>在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中,您可以直接将数据上下文设置为详细视图:

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

谢谢你的代码!我确实找到了另一种方法,我创建了一个名为"datacontext"的对象,然后将我的SecondView的DataContext设置为datacontext。但是你的方法更简单,现在我清楚了如何在视图和视图模型之间传递数据。非常感谢! - BeginnerCoder

1
您可以使用其他解决方案,http://sharedprop.codeplex.com,阅读源代码是在对象之间共享属性的一种方式,即使第二个对象不处于活动状态也可以使用...仅供参考。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接