【发布时间】:2017-03-01 15:15:41
【问题描述】:
Foreach treeview-item 我有一个自己的数据网格。 Treeview-items 和 datagrids 通过绑定填充。
在文本框上,我绑定了数据网格的选定项。但是这些文本框上的绑定仅适用于第一个数据网格。其他所有数据网格都不会将选定项传输到文本框:
这是带有数据网格的树视图:
<TreeView ItemsSource="{Binding Path=PlaceList}">
<TreeView.ItemTemplate>
<DataTemplate>
<TreeViewItem Header="{Binding Path=Name}">
<DataGrid ItemsSource="{Binding MachinesInPlace, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectionUnit="FullRow"
SelectedItem="{Binding SelectedMachine, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
AutoGenerateColumns="True"
IsSynchronizedWithCurrentItem="True"
SelectionMode="Single">
</DataGrid>
</TreeViewItem>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
这是文本框:
<TextBox Text="{Binding PlaceList/SelectedMachine.Name, ValidatesOnDataErrors=True}" />
我正在使用 MvvmLight。我的 ViewModel 拥有 PlaceList:
public ObservableCollection<PlaceModel> PlaceList { get; set; } = new ObservableCollection<PlaceModel>();
public ObjectInspectorViewModel()
{
PlaceList = PlaceModel.GetPlaces(BaseResourcePaths.PlacesCsv);
}
那是我的地方模型:
public class PlaceModel
{
public int Id { get; set; }
public string Name { get; set; } = "_CurrentObjectName";
public string Length { get; set; }
public string Width { get; set; }
public string Height { get; set; }
public ObservableCollection<MachineModel> MachinesInPlace { get; set; }
public MachineModel SelectedMachine { get; set; }
public static ObservableCollection<PlaceModel> GetPlaces(string filepath)
{
[...]
}
}
我尝试了一些东西,但最后我不知道如何修复这个错误。有什么问题?我的建议是放置模型内的属性“SelectedMachine”...
这是一个示例项目(带有 Sebastian Richter 的附加解决方案)。它显示了问题:https://www.file-upload.net/download-12370581/DatagridTreeViewError.zip.html
【问题讨论】:
-
你不需要树视图上的 SelectedItem,然后根据它绑定到文本框吗?否则,绑定只是抓取第一个实例,而不是在进行树视图选择时更新。
-
谢谢你的回复。我尝试了您的解决方案,但没有奏效。我必须使用 stackoverflow.com/a/3535089 上的 SelectedItem 属性扩展树视图控件。我最终得到了以下 XAML:pastebin.com/VVgBtCqR 问题是树视图包含一个充满位置的列表,并且每个位置都有一个不同的(数据网格)机器列表。因此,在 treeview-select 上,我可以获得选择了哪个位置列表,但我无法获得选择了这些位置列表中的哪台机器。还是我错了?
标签: wpf binding datagrid mvvm-light