WPF datagrid selectedvalue / selecteditem绑定不起作用

时间:2014-06-11 10:57:05

标签: c# wpf datagrid

我有我的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属性未更新。 Howewer,如果我删除

SelectionMode="Single" 
SelectionUnit="CellOrRowHeader"  

绑定工作正常。

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

2 个答案:

答案 0 :(得分:3)

MSDN知道。如果你查看MSDN上的DataGrid.SelectionUnit Property页面,它会说:

  

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

最常见(默认)值为FullRow,因此您可以尝试此操作。

如果您查看MSDN上的Selector.SelectedValue Property页面,则会说:

  

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

因此,您的第一个问题是您没有将SelectedValuePath属性设置为要传递到SelectedValue属性的属性的名称。但是,通常将与DataGrid.ItemsSoucre集合中的项目相同类型的对象数据绑定到SelectedItem属性,然后可以绑定到整个选定的项目对象。

我怀疑删除SelectionMode属性会对这种情况产生任何影响。因此,为了解决您的问题,我将DataGrid.SelectionUnit属性设置为FullRow,数据绑定到SelectedItem属性,而不是使用SelectedValue和{{1} }属性。您可以在MSDN上的How to: Use SelectedValue, SelectedValuePath, and SelectedItem页面中找到这些所选项目属性之间的进一步差异。

答案 1 :(得分:1)

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

由于DataGrid中的每一行代表数据项,因此选择完整行将选择项目,或SelectionUnit="FullRow"将选择项目。否则,如果您有其他SelectionUnit,那么您可以SelectedItem

获得DataGrid.SelectedCells[0].Item

此外,您不能绑定SelectedValuePath,但SelectedValue