wpf - 在 View 模型之间传递数据的正确方法是什么?

标签 wpf mvvm viewmodel interaction

我刚刚开始使用 MVVM,我一直在阅读它并做了一些示例。我设法创建了一个应用程序,该应用程序将从数据库中读取,然后填充到列表框中。我很难尝试将所选项目链接到另一个 View ,然后在该 View 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 上我想显示一些细节

提前致谢!

最佳答案

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

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 中,您可以将数据上下文直接设置为详细 View :
<local:SecondView Margin="499,30,0,20" DataContext="{Binding DetailView, Mode=OneWay}" />

关于wpf - 在 View 模型之间传递数据的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14412405/

相关文章:

apache-flex - 避免 View 模型中的重复数据和计算

c# - 从列表框中获取选中的项目

wpf - WPF .NET 4.0 的刷新问题 - 黑色垂直线

c# - 如何刷新/重新加载桌面

c# - 如何读取项目根目录中的文本文件?

c# - 使用 ObservableCollection 绑定(bind) WPF DataGrid Combobox 列的问题

ios - 使用默认值初始化 ViewModel

c# - 为什么 Thread.Join() 挂起,即使线程中的方法已经返回?

wpf - MVVM:如果后台线程不断更改模型怎么办?

c# - 已定义WPF MVVM OnPropertyChanged,但未在其他 View 模型上显示