C# 使用MVVM在WPF数据网格中进行预选
我已将DataGrid绑定到其ViewModel中的ObservableCollection: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 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;
}