【问题标题】:Preselection in WPF-DataGrid with MVVM使用 MVVM 在 WPF-DataGrid 中进行预选
【发布时间】:2023-03-21 13:01:01
【问题描述】:

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

现在我想要的是,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-binding 并在 Code-behind 中添加以下内容,则效果很好:

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

【问题讨论】:

  • 如果在 DataGrid 中选择一行更新您的视图模型的 CurrentItem 属性,您可以试试吗?
  • @Amit 如果您想知道,如果当我单击网格中的一行时调用 CurrentItem-setter,那么答案是肯定的。即使我省略了绑定方向的设置。
  • 我注意到了同样的问题并最终使用了相同的解决方法。
  • @RQDQ 谢谢。我现在有点魅力了;-)
  • 如何/在哪里将 MainViewModel 设置为 DataContext?因为我已经根据您的代码创建了一个小型重现,并且预选工作正常。

标签: c# wpf mvvm mvvm-light


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 2010-12-24
    • 2013-03-31
    • 1970-01-01
    • 2018-05-16
    • 2021-07-17
    • 2013-03-06
    相关资源
    最近更新 更多