WPF数据网格selectedvalue/selecteditem绑定不起作用



我有我的datagrid:

<DataGrid CanUserSortColumns="False" x:Name="TablePreviewDataGrid" 
                      SelectionMode="Single" 
                      SelectionUnit="CellOrRowHeader"  
                      SelectedValuePath="{Binding Item}"
                      SelectedCellsChanged="DataGrid_OnSelectedCellsChanged"
                      IsReadOnly="True" ItemsSource="{Binding TableData}" 
                      AutoGenerateColumns="True">
    <DataGrid.Resources>
        <Style TargetType="DataGridColumnHeader">
            <EventSetter Event="Click" Handler="EventSetter_OnHandler" />
        </Style>
    </DataGrid.Resources>
</DataGrid>

和绑定:

private DataTable _tableData;
public DataTable TableData
{
    get { return _tableData; }
    set { SetProperty(ref _tableData, value); }
}
private object _selectedItem;
public object Item
{
    get { return _selectedItem; }
    set { SetProperty(ref _selectedItem, value); }
}
当我点击网格单元格时,

Item属性不更新。但是,如果我删除

SelectionMode="Single" 
SelectionUnit="CellOrRowHeader"  

绑定工作正常。

有人知道为什么会这样吗?

MSDN知道。如果你看一下MSDN上的DataGrid.SelectionUnit属性页面,它说:

获取或设置一个值,该值指示DataGrid中是否可以选择行、单元格或两者。

最常见的(默认的)值是FullRow,所以您可以试试这个。

如果你看一下MSDN上的Selector.SelectedValue属性页面,它说:

获取或设置通过使用SelectedValuePath获得的SelectedItem的值。

所以你的第一个问题是你没有将SelectedValuePath属性设置为你想要传递给SelectedValue属性的属性的名称。然而,更常见的是将与DataGrid.ItemsSoucre集合中的项目相同类型的对象绑定到SelectedItem属性,然后可以绑定到整个选定的项目对象。

我怀疑在这种情况下删除SelectionMode属性会有任何不同。因此,为了解决您的问题,我将DataGrid.SelectionUnit属性设置为FullRow,并将数据绑定到SelectedItem属性,而不是使用SelectedValueSelectedValuePath属性。您可以在MSDN上的"如何:使用SelectedValue、SelectedValuePath和SelectedItem"页面中找到这些选定项属性之间的进一步差异。

你的罪魁祸首是SelectionUnit="CellOrRowHeader"SelectedValuePath="{Binding Item}".

由于DataGrid中的每一行都代表数据项,因此选择整行将选择该项或SelectionUnit="FullRow"将选择该项。否则如果你有其他的SelectionUnit那么你可以通过DataGrid.SelectedCells[0].Item获取SelectedItem

你不绑定SelectedValuePath而是SelectedValue

最新更新