使用MVVM在WPF-DataGrid中进行预选

时间:2011-11-30 13:20:10

标签: c# wpf mvvm mvvm-light

我已经将DataGrid绑定到ObservableCollection<>在其ViewModel中:

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

现在我想要的是,DataGrid将在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;
    }

1 个答案:

答案 0 :(得分:1)

正在发生的事情是,在初始化窗口之前,您的VM被分配到数据上下文,因此永远不会收到CurrentItem已更改的消息,因为它在加载之前已更改。

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

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

顺便说一句,在使用MVVM时,我认为没有理由不将ViewModel传递给View,因为视图依赖于它。我知道有些人会有不一样的感觉,但这或者你要在Window_Loaded事件中对datacontext进行某种类型的刷新。