将列表视图动态绑定到相应的数据网格行
Dynamically bind listview to corresponding datagrid row
我在数据网格中有一个列表视图,但是我无法分配依赖于 ItemsSource="{Binding Users}"
的 id 的项目源。换句话说,我试图让每个列表视图只显示与 id 对应的数据。
我目前有一个循环可以为用户收集数据的数据集,我只是在绑定每个数据集时遇到了问题。
<DataGrid Name="dgUsers" ItemsSource="{Binding Users}">
<DataGrid.Columns>
<DataGridTextColumn Header="Client" Binding="{Binding Name}"/>
<!-- <DataGridTextColumn Header="Land Line" Binding="{Binding LandLine}"/> -->
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate x:Name="datatemplate">
<DockPanel Background="GhostWhite">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListView x:Name="lvData" Margin="10,82,10,156" Grid.Column="2" ItemsSource="{Binding view }" SelectedValue="{Binding selectedValue}" MouseDoubleClick="LoadSelectedData" >
<ListView.View>
<GridView>
<GridViewColumn Width="150" DisplayMemberBinding="{Binding type}">
<GridViewColumnHeader Tag="type" Content="Type" FontSize="12"/>
</GridViewColumn>
<GridViewColumn Width="150" DisplayMemberBinding="{Binding source}">
<GridViewColumnHeader Tag="source" Content="Source" FontSize="12"/>
</GridViewColumn>
<GridViewColumn Width="180" DisplayMemberBinding="{Binding stage}">
<GridViewColumnHeader Tag="stage" Content="Stage" FontSize="12"/>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
如果我理解正确你在做什么——每个 User
都有一个属性列表——通常的方法是放置一个预过滤的 属性 集合数据网格中每个用户项目上的项目,然后将其绑定到 RowDetailsTemplate
中的 ListView
。 DataTemplate
中的 DataContext
将是 User
class 的某个实例,因此如果该用户属性集合是 User.dataForUser
,您只需像这样绑定所以:
<ListView ItemsSource="{Binding dataForUser}" ... />
应该就可以了。
您还可以编写一个 multi-value converter 并将其与绑定整个集合和用户 ID 的多重绑定一起使用,以过滤集合中所需的项目子集。转换器将执行过滤和 return a List<SomeUserPropertyClass>
。无需将其设为 ObservableCollection
,因为在 IMultiDataConverter.Convert()
return 之后您不会对其进行任何更改。但是绑定到完整集合将意味着某种 RelativeSource
绑定以从主视图模型中获取 属性。 XAML 中有很多额外的噪音。
在我看来,将这种主从关系构建到视图模型 classes 中既合适又方便。
我在数据网格中有一个列表视图,但是我无法分配依赖于 ItemsSource="{Binding Users}"
的 id 的项目源。换句话说,我试图让每个列表视图只显示与 id 对应的数据。
我目前有一个循环可以为用户收集数据的数据集,我只是在绑定每个数据集时遇到了问题。
<DataGrid Name="dgUsers" ItemsSource="{Binding Users}">
<DataGrid.Columns>
<DataGridTextColumn Header="Client" Binding="{Binding Name}"/>
<!-- <DataGridTextColumn Header="Land Line" Binding="{Binding LandLine}"/> -->
</DataGrid.Columns>
<DataGrid.RowDetailsTemplate>
<DataTemplate x:Name="datatemplate">
<DockPanel Background="GhostWhite">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<ListView x:Name="lvData" Margin="10,82,10,156" Grid.Column="2" ItemsSource="{Binding view }" SelectedValue="{Binding selectedValue}" MouseDoubleClick="LoadSelectedData" >
<ListView.View>
<GridView>
<GridViewColumn Width="150" DisplayMemberBinding="{Binding type}">
<GridViewColumnHeader Tag="type" Content="Type" FontSize="12"/>
</GridViewColumn>
<GridViewColumn Width="150" DisplayMemberBinding="{Binding source}">
<GridViewColumnHeader Tag="source" Content="Source" FontSize="12"/>
</GridViewColumn>
<GridViewColumn Width="180" DisplayMemberBinding="{Binding stage}">
<GridViewColumnHeader Tag="stage" Content="Stage" FontSize="12"/>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
如果我理解正确你在做什么——每个 User
都有一个属性列表——通常的方法是放置一个预过滤的 属性 集合数据网格中每个用户项目上的项目,然后将其绑定到 RowDetailsTemplate
中的 ListView
。 DataTemplate
中的 DataContext
将是 User
class 的某个实例,因此如果该用户属性集合是 User.dataForUser
,您只需像这样绑定所以:
<ListView ItemsSource="{Binding dataForUser}" ... />
应该就可以了。
您还可以编写一个 multi-value converter 并将其与绑定整个集合和用户 ID 的多重绑定一起使用,以过滤集合中所需的项目子集。转换器将执行过滤和 return a List<SomeUserPropertyClass>
。无需将其设为 ObservableCollection
,因为在 IMultiDataConverter.Convert()
return 之后您不会对其进行任何更改。但是绑定到完整集合将意味着某种 RelativeSource
绑定以从主视图模型中获取 属性。 XAML 中有很多额外的噪音。
在我看来,将这种主从关系构建到视图模型 classes 中既合适又方便。