如何正确绑定Datagrid的SelectedItem为只读列表?

时间:2013-11-01 16:47:27

标签: c# wpf data-binding datagrid selecteditem

xaml视图:

<DataGrid x:Name="dgInstances" SelectedItem="{Binding Path=Instance, Mode=OneWay}"
            ItemsSource="{Binding Instances}"> SelectionMode="Single"> ... etc.

视图模型:

public List<string> Instances
string instance;
public string Instance
{
    get
    {
        if (instance == null && instances.HasItems())
        {
            instance = instances[0];
        }
        if (instance != null)
        {
            return instance;
        }
        return null;
    }
    set
    {
        instance = value;
    }
}

view-model-class实现INotifyPropertyChanged,在获取Instances之后,我提供RaisePropertyChanged("Instance");
实例正确显示在数据网格中,但未选择第一个项目 我不想添加SelectedIndex=0,因为它必须通过绑定 当我更改数据网格中的选择时,不使用数据绑定Instance的setter。
这当然也是一项要求 它是一个只读列表:只有selecteditem必须是数据绑定,而不是任何值。

1 个答案:

答案 0 :(得分:1)

虽然我没有真正使用WPF DataGrid,但我过去做过,似乎记得你不能BindDataGrid.SelectedItem属性......所有,这是一个非常无用的财产。但是,我相信你可以 BindDataGrid.CurrentItem property这几乎可以做同样的事情。


更新&gt;&gt;&gt;

我刚发现StackOverflow上的WPF DataGrid SelectedItem binding stops working after item change帖子提到了这一点。

此外,您似乎可以在UI元素DataGrid.SelectedItem中使用Binding属性,例如。将它显示在TextBox中,所以它并非完全无用......只是大部分没用。


更新2&gt;&gt;&gt;

如果确实需要访问DataGrid.SelectedItem属性,您可以创建AttachedProperty来处理DataGrid.SelectionChanged事件。


更新3&gt;&gt;&gt;

我的集合类扩展了一个自定义基类,它扩展了ObservableCollection<T>类。我的自定义BaseColection<T>类具有类型为CurrentItem的{​​{1}}属性。我将此属性用于T到集合控件的Bind。但是,这与将属性添加到与正在显示的集合中的项目相同类型的视图模型中的效果相同,但它更方便:

SelectedItem

然后,如果集合中的项目很小并且包含需要编辑的所有数据,我将只使用<ListBox ItemsSource="{Binding AudioTracks}" SelectedItem="{Binding AudioTracks.CurrentItem}" ... /> 属性作为右侧的可编辑字段我的示例图片。但是,如果数据对象在图像中有很多字段,那么我只需使用AudioTracks.CurrentItem属性值发送到数据库以检索编辑所需的所有值,而AudioTracks.CurrentItem.Id集合中的项目只包含一些值(因为集合中可能有27,000多个值。

最后,关于AudioTracks的关联示例,我通常会使用自定义TreeViewSelectedItems Attached Property Bind属性...如果您在线搜索,你可能会找到某人的示例代码。