C# 使用MVVM在WPF数据网格中进行预选

C# 使用MVVM在WPF数据网格中进行预选,c#,wpf,mvvm,mvvm-light,C#,Wpf,Mvvm,Mvvm Light,我已将DataGrid绑定到其ViewModel中的ObservableCollection: <DataGrid ItemsSource="{Binding Path=Data}" SelectedItem="{Binding Path=CurrentItem}" /> public ObservableCollection<TestModel> Data { get; set; } private TestModel _currentItem;

我已将DataGrid绑定到其ViewModel中的ObservableCollection:

<DataGrid ItemsSource="{Binding Path=Data}" SelectedItem="{Binding Path=CurrentItem}" />
    public ObservableCollection<TestModel> Data { get; set; }

    private TestModel _currentItem;

    public TestModel CurrentItem
    {
        get { return _currentItem; }
        set
        {
            _currentItem = value;
            RaisePropertyChanged("CurrentItem");
        }
    }

发生的情况是,您的VM在初始化窗口之前被分配到数据上下文,因此从未收到CurrentItem已更改的消息,因为它在加载之前已更改

我要做的是将视图模型传递到视图的构造函数中,并在调用InitializeComponent()函数后设置它。因为我使用的是Prism,所以我使用的是控制反转(InversionofControl,IOC),Prism知道如何将我的VM输入构造函数。如果要自己实例化视图和视图模型,只需传入视图模型即可。我遇到了同样的问题,这是有效的

    public MyView(IMyVM viewModel)
    {
        InitializeComponent();
        this.DataContext = viewModel;
    }

顺便说一下,在使用MVVM时,我认为没有理由不将ViewModel传递到视图中,因为视图无论如何都依赖于它。我知道有些人有不同的感觉,但要么是这样,要么你必须在Window_Loaded事件中对datacontext进行某种类型的刷新。

发生的情况是,在初始化窗口之前,您的VM被分配到了数据上下文,因此从未收到CurrentItem已更改的消息,因为它已被更改在加载之前已更改

我要做的是将视图模型传递到视图的构造函数中,并在调用InitializeComponent()函数后设置它。因为我使用的是Prism,所以我使用的是控制反转(InversionofControl,IOC),Prism知道如何将我的VM输入构造函数。如果要自己实例化视图和视图模型,只需传入视图模型即可。我遇到了同样的问题,这是有效的

    public MyView(IMyVM viewModel)
    {
        InitializeComponent();
        this.DataContext = viewModel;
    }

顺便说一下,在使用MVVM时,我认为没有理由不将ViewModel传递到视图中,因为视图无论如何都依赖于它。我知道有些人有不同的感觉,但要么是这样,要么你必须在Window\u Loaded事件中对datacontext进行某种类型的刷新。

如果在DataGrid中选择一行,你能尝试更新视图模型的CurrentItem属性吗?@Amit如果你想知道,如果在我单击网格中的一行时调用CurrentItem setter,那么答案是yes,它是。即使我忽略了绑定方向的设置,我也注意到了同样的问题,并最终使用了相同的解决方法。@RQDQ对此表示感谢。我现在有点迷人;-)如何/在何处将MainViewModel设置为DataContext?因为我已经根据您的代码创建了一个小的复制程序,并且预选工作正常。如果在DataGrid中选择一行,您可以尝试更新视图模型的CurrentItem属性吗?@Amit如果您想知道,如果我在网格中单击一行时调用了CurrentItem setter,那么答案是肯定的,是肯定的。即使我忽略了绑定方向的设置,我也注意到了同样的问题,并最终使用了相同的解决方法。@RQDQ对此表示感谢。我现在有点迷人;-)如何/在何处将MainViewModel设置为DataContext?因为我已经根据你的代码创建了一个小的复制程序,预选工作正常。
    public MyView(IMyVM viewModel)
    {
        InitializeComponent();
        this.DataContext = viewModel;
    }