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必须是数据绑定,而不是任何值。
答案 0 :(得分:1)
虽然我没有真正使用WPF DataGrid
,但我过去做过,似乎记得你不能Bind
到DataGrid.SelectedItem
属性......所有,这是一个非常无用的财产。但是,我相信你可以 Bind
到DataGrid.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
的关联示例,我通常会使用自定义TreeView
到SelectedItems Attached Property
Bind
属性...如果您在线搜索,你可能会找到某人的示例代码。