1

我是 MVVM 和 WPF 的新手。

我正在使用 MVVM Light 制作一个应用程序,该应用程序在一个窗口中包含一个 DataGrid,该窗口具有一个视图模型 (MainViewModel) 和另一个用于在 DataGrid 中添加和编辑记录的窗口,该窗口也有自己的视图模型 (EditViewModel)。

我担心的是我用来从 MainViewModel 打开添加/编辑窗口的方法。在 MainViewModel 中,我有一个属性 SelectedItem,它绑定到 DataGrid 的 SelectedItem 属性和一个 IsEdit 布尔属性,指示是否应在添加或编辑模式下启动添加/编辑窗口。

当添加/编辑窗口在编辑模式下打开时,在其视图模型的构造函数中,我有以下行:

 MainViewModel mainViewModel = ServiceLocator.Current.GetInstance<MainViewModel>();

这显然检索了 MainViewModel 的当前实例,它工作得非常好,但我不确定这是不是最好的方法。

此外,如果我有多个主窗口实例,它们使用相同的 MainViewModel 实例,并且我从它们两者中打开一个添加/编辑窗口的实例,则添加/编辑窗口将从同一个实例获取数据MainViewModel 这可能是一个问题。

如果我尝试为打开的每个 MainWindow 创建一个新的 MainViewModel 实例,那么我不知道如何将当前使用的 MainViewModel 的实例传递给 EditViewModel。

我希望我清楚我需要做什么。告诉我我是否遗漏了什么,我会添加它:)

提前致谢

4

1 回答 1

0

嗨,如果我没有误解你的问题不正确,你可以这样做: 因为我在 MainView 和 EditView 中都需要 IsRequired 依赖属性,所以我创建了一个扩展 Window 类的类

public class ExtendedWindow:Window
{
    public static readonly DependencyProperty IsRequiredProperty = DependencyProperty.Register("IsRequired", typeof(bool), typeof(ExtendedWindow));

    public bool IsRequired
    {
        get { return (bool)GetValue(IsRequiredProperty); }
        set { SetValue(IsRequiredProperty, value); }
    }
}

主视图和视图模型

    public partial class MainWindow:ExtendedWindow
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new MainViewModel();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        EditView editView = new EditView();
        **((EditViewModel)editView.DataContext).IsRequired = this.IsRequired;**
        editView.Show();
    }
}

public class MainViewModel : INotifyPropertyChanged
{
    public MainViewModel()
    {
        IsRequired = true;
    }
    private bool isRequired;
    public bool IsRequired
    {
        get { return isRequired; }
        set { isRequired = value; Notify("IsRequired"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}

编辑视图和视图模型

public partial class EditView:ExtendedWindow
{
    public EditView()
    {
        InitializeComponent();
        DataContext = new EditViewModel();
    }
}

public class EditViewModel : INotifyPropertyChanged
{
    private bool isRequired;
    public bool IsRequired
    {
        get { return isRequired; }
        set { isRequired = value; Notify("IsRequired"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void Notify(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }
}

这只是一种假动作,但可以让您了解如何做到这一点。我已经在假人中尝试过它并且工作正常。

于 2013-02-15T02:14:15.860 回答