【问题标题】:DataGrid SelectedItem Being Bound to Wrong DataContext MVVM PatternDataGrid SelectedItem 绑定到错误的 DataContext MVVM 模式
【发布时间】:2012-05-26 04:33:40
【问题描述】:

我正在尝试获取已绑定到 CollectionViewSource 的数据网格的当前选定项。但是,似乎 SelectedItem 属性未正确绑定到我在 ViewModel 中设置的属性。

      <Grid DataContext="{Binding CollectionView}">
        <DataGrid ItemsSource="{Binding}" Margin="0,30,0,0" SelectedItem="{Binding SelectedRow}" />
      </Grid>

在运行项目时,在VS2010的输出框中看到这个错误信息。

System.Windows.Data Error: 40 : BindingExpression path error: 'SelectedRow' property not found on 'object' ''BindingListCollectionView' (HashCode=56718381)'. BindingExpression:Path=SelectedRow; DataItem='BindingListCollectionView' (HashCode=56718381); target element is 'DataGrid' (Name=''); target property is 'SelectedItem' (type 'Object')

我知道数据网格的 SelectedItem 属性正在尝试绑定到 CollectionViewSource,但我不太确定如何告诉 SelectedItem 绑定到我的 ViewModel 的 SelectedRow 属性。任何帮助,将不胜感激。另外,如果您需要有关我的设置的更多信息,请随时询问。

这是我的 ViewModel 中的属性,以备不时之需:

    public DataRow SelectedRow
    {
        get
        {
            return _selectedRow;
        }

        set
        {
            _selectedRow = value;
            OnPropertyChanged("SelectedRow");
        }
    }

【问题讨论】:

    标签: wpf data-binding binding mvvm


    【解决方案1】:

    我做了更多的挖掘,并能够想出一个解决方案。本质上,我需要告诉 SelectedItem 属性回头查看 MainWindow 的 DataContext。

    我将 XAML 更改为:

        <Grid DataContext="{Binding CollectionView}">
            <DataGrid ItemsSource="{Binding}" Margin="0,30,0,0" SelectedItem="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.SelectedRow}">
            </DataGrid>
        </Grid>
    

    然后将我的 ViewModel 中的属性更改为 DataRowView 而不是 DataRow

    public DataRowView SelectedRow
    {
        get
        {
            return _selectedRow;
        }
    
        set
        {
            _selectedRow = value;
            OnPropertyChanged("SelectedRow");
        }
    }
    

    谢谢大家!

    【讨论】:

    • 谢谢,我也遇到了同样的问题,只有将 Property 的 DataRow 类型更改为 DataRowView 对我有用,谢谢!
    【解决方案2】:

    SelectedRow 不是CollectionView 的属性。我假设两者都是您的 ViewModel 的属性:

    <Grid DataContext="{Binding}">
        <DataGrid ItemsSource="{Binding CollectionView}"
                  SelectedItem="{Binding SelectedRow}" />
    </Grid>
    

    【讨论】:

      【解决方案3】:

      您的绑定中有SelectedItem,您的属性名称是SelectedRow - 请确保它们相同。

      【讨论】:

        【解决方案4】:

        将 DataRow 更改为您要绑定的任何实际对象类型。

        public **Object each row represents in view model** SelectedRow
        {
            get
            {
                return _selectedRow;
            }
        
            set
            {
                _selectedRow = value;
                OnPropertyChanged("SelectedRow");
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-08-29
          • 2015-01-21
          • 2012-02-12
          • 2014-10-10
          • 2021-11-08
          • 2012-11-22
          • 2013-11-16
          • 2012-06-24
          相关资源
          最近更新 更多