1

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;
    }
}

视图模型类实现INotifyPropertyChanged并在Instances获取后我给出 RaisePropertyChanged("Instance");.
实例正确显示在数据网格中,但未选择第一项。
我不想添加SelectedIndex=0,因为它必须通过绑定。
而当我更改数据网格中的选择时,Instance不使用数据绑定的设置器。
这当然也是一个要求。
它是一个只读列表:只有选定项必须是数据绑定的,而不是任何值。

4

1 回答 1

1

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


更新>>>

我刚刚发现WPF DataGrid SelectedItem 绑定在 StackOverflow 上提到这一点的项目更改帖子后停止工作。

此外,您似乎可以DataGrid.SelectedItem在 UI 元素中使用该属性Binding,例如。将其显示在 a 中TextBox,因此它并非完全没用……只是几乎没用。


更新 2 >>>

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


更新 3 >>>

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

<ListBox ItemsSource="{Binding AudioTracks}" 
    SelectedItem="{Binding AudioTracks.CurrentItem}" ... />

然后,如果集合中的项目很小并且包含所有需要编辑的数据,我将只使用AudioTracks.CurrentItem示例图像右侧的可编辑字段的属性。但是,如果数据对象有很多像图像中的字段,那么我只需使用AudioTracks.CurrentItem.Id属性值发送到数据库以检索编辑所需的所有值,而AudioTracks集合中的项目仅包含几个值(因为集合中可能有 27,000 多个。

最后,关于 a 的链接示例TreeView,我通常会对该属性使用自定义...SelectedItems Attached Property如果您在线搜索,您可能会找到某人的示例代码。BindTreeView.SelectedItems

于 2013-11-01T17:03:45.993 回答