2011-11-30 88 views
1

我得的DataGrid绑定到其视图模型一个ObservableCollection <>:预选在WPF的DataGrid中与MVVM

<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"); 
     } 
    } 

现在我想的是,该数据网格将在Form-startup上预选第一行。所以,我把我的测试代码下面的构造函数中:

Data = new ObservableCollection<TestModel> 
    { 
     new TestModel() { Property1 = Guid.NewGuid().ToString() }, 
     new TestModel() { Property1 = Guid.NewGuid().ToString() }, 
     new TestModel() { Property1 = Guid.NewGuid().ToString() } 
    }; 
    CurrentItem = Data[0]; 

显示数据,但第一行不是由电网选择。即使我将绑定设置为TwoWay,它也不起作用。

如果我删除在XAML中的SelectedItem结合,并添加以下代码隐藏,它工作得很好:

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     var m = this.DataContext as MainViewModel; 
     grid.SelectedItem = m.CurrentItem; 
    } 
+0

你可以尝试如果选择DataGrid中的一行更新您的视图模型的CurrentItem属性? – Amit

+0

@Amit如果你想知道,如果当我点击网格中的一行时调用CurrentItem-setter,那么答案是肯定的,它是。即使我忽略了绑定方向的设置。 – sprinter252

+1

我注意到同样的问题,并最终使用相同的解决方法。 – RQDQ

回答

1

发生了什么事是你的虚拟机被分配给数据上下文之前的窗口初始化,因此永远不会收到CurrentItem已更改的消息,因为它在加载前已更改。

我所做的是将View模型传入View的构造函数,并在调用InitializeComponent()函数后将其设置。因为我使用Prism,所以我使用控制反转(IOC),Prism知道将我的虚拟机输入到构造函数中。如果您自己实例化视图和视图模型,则可以传入视图模型。我遇到了同样的问题,这工作。

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

顺便说一句,与MVVM工作,我看不出有什么理由不向视图模型传递到视图,因为视图是依赖于也无妨。我知道有些人感觉不同,但是它不是这样,或者你必须在Window_Loaded事件中进行某种类型的datacontext刷新。