0

所以,我有一个listview不同datatemplates的在这里看到:

<ListView Panel.ZIndex="0" x:Name="FilterList" Margin="10,0" Grid.Row="2" 
    Grid.ColumnSpan="3" Background="White" ItemTemplateSelector="{StaticResource 
    ReportFilterTemplateSelector}" ItemsSource="{Binding reportParameters, 
    Mode=TwoWay}" ScrollViewer.CanContentScroll="False">

我的一个样本datatemplates如下所示。一切都很好。我的问题是,对于这个(和其他)datatemplates,我可以拥有同一个实例的多个实例。在这种特殊情况下,treeview itemssource必然会DataContext.OfficeListText填充所有元素。

    <DataTemplate x:Key="office">
        <Grid MinHeight="35" MaxHeight="250">
            <Grid.RowDefinitions>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="100"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <TextBlock Text="{Binding rpName}" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0" />
            <Expander HorizontalAlignment="Stretch" Grid.Row="0" Grid.Column="1" 
                Header="{Binding Path=DataContext.OfficeListText, RelativeSource=
                {RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" 
                VerticalAlignment="Top" ExpandDirection="Down">

                <TreeView Tag="{Binding rpParameter}" HorizontalAlignment="Stretch" 
                    VerticalAlignment="Stretch" ItemsSource="{Binding 
                    Path=DataContext.OfficeList, RelativeSource={RelativeSource 
                    FindAncestor, AncestorType={x:Type UserControl}}, Mode=TwoWay}" 
                    ItemTemplate="{StaticResource CheckBoxItemTemplate}" 
                    ItemContainerStyle="{StaticResource TreeViewItemStyle}"/>
            </Expander>
        </Grid>
    </DataTemplate>

主要问题是一个,例如,如果我在第一个中选择一个办公室treeview,第二个treeview显示相同。本质上,我希望它们最初具有相同的 itemssource,但具有单独的实例。因为它们是动态生成的,所以我遇到了困难。任何帮助,将不胜感激。

我不确定还需要哪些其他代码,因为我确信根据我需要做些什么来完成这项工作,大部分代码都是不敬的,但如果你想要更多,我很乐意提供。谢谢!

4

1 回答 1

0

当前,您的 TreeView 绑定到属于您的 UserControl 的 DataContext 的 OfficeList 的单个实例。这意味着每个 TreeView 都指向同一个列表。如果我正确理解了您的问题,那么您真正想要的是为每个 TreeView 拥有一个不同的 OfficeList 实例。

我不建议每次将 DataTemplate 应用于 reportParameter 时都实例化一个新的 OfficeList。你可以使用 ValueConverter 来做到这一点,但它会很笨拙。

更简洁的解决方案是拥有一个包含您的 reportParameter 数据的类以及一个 OfficeList 实例,然后绑定到该类的实例而不是绑定到 UserControl。根据 reportParameters 的结构(我将假设 reportParameters 是 ReportParameter 类型的对象列表),您可能需要两种方法来执行此操作:

1)如果ReportParameter是ViewModel,可以简单的在ReportParameter类中添加一个OfficeList属性,在实例化每个ReportParameter时初始化。

然后您的 TreeView 将如下所示:

<TreeView Tag="{Binding rpParameter}" HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" ItemsSource="{Binding Path=OfficeList, Mode=TwoWay}" 
    ItemTemplate="{StaticResource CheckBoxItemTemplate}" 
    ItemContainerStyle="{StaticResource TreeViewItemStyle}"/>

2) 如果 ReportParameter 不是 ViewModel(因此不适合添加 OfficeList 参数),则创建一个名为 ReportParameterViewModel 的新类,其中包含 2 个属性:ReportParameter 和 OfficeList。不是将您的 ListView 绑定到 ReportParameter 列表,而是绑定到 ReportParameterViewModel 列表。

然后您的 ListView 将如下所示:

<ListView Panel.ZIndex="0" x:Name="FilterList" Margin="10,0" Grid.Row="2" 
    Grid.ColumnSpan="3" Background="White" ItemTemplateSelector="{StaticResource 
    ReportFilterTemplateSelector}" ItemsSource="{Binding reportParameterViewModels, 
    Mode=TwoWay}" ScrollViewer.CanContentScroll="False">

您的 TextBlock 将如下所示:

<TextBlock Text="{Binding ReportParameter.rpName}" VerticalAlignment="Center" Grid.Row="0" Grid.Column="0" />

您的 TreeView 将如下所示:

<TreeView Tag="{Binding rpParameter}" HorizontalAlignment="Stretch" 
    VerticalAlignment="Stretch" ItemsSource="{Binding Path=OfficeList, Mode=TwoWay}" 
    ItemTemplate="{StaticResource CheckBoxItemTemplate}" 
    ItemContainerStyle="{StaticResource TreeViewItemStyle}"/>
于 2013-11-05T20:05:30.377 回答