将列表视图动态绑定到相应的数据网格行

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 中的 ListViewDataTemplate 中的 DataContext 将是 User class 的某个实例,因此如果该用户属性集合是 User.dataForUser,您只需像这样绑定所以:

<ListView ItemsSource="{Binding dataForUser}" ... />

应该就可以了。

您还可以编写一个 multi-value converter 并将其与绑定整个集合和用户 ID 的多重绑定一起使用,以过滤集合中所需的项目子集。转换器将执行过滤和 return a List<SomeUserPropertyClass>。无需将其设为 ObservableCollection,因为在 IMultiDataConverter.Convert() return 之后您不会对其进行任何更改。但是绑定到完整集合将意味着某种 RelativeSource 绑定以从主视图模型中获取 属性。 XAML 中有很多额外的噪音。

在我看来,将这种主从关系构建到视图模型 classes 中既合适又方便。