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">

私のサンプルの 1 つを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、2 番目treeviewに同じものが表示されることです。基本的に、最初は同じアイテムソースを持ちますが、別々のインスタンスを持つ必要があります。それらは動的に生成されるため、ここで行き詰まります。どんな助けでも大歓迎です。

これを機能させるために必要なことに基づいて、そのほとんどが無礼になると確信しているため、他にどのようなコードが必要になるかはわかりませんが、さらに必要な場合は喜んで提供します. ありがとう!

4

1 に答える 1

0

現在、TreeView は、UserControl の DataContext に属する OfficeList の単一のインスタンスにバインドされています。これは、すべての TreeView が同じリストを指していることを意味します。私があなたの質問を正しく理解していれば、本当に必要なのは、TreeView ごとに異なる OfficeList のインスタンスを持つことです。

DataTemplate が reportParameter に適用されるたびに新しい OfficeList をインスタンス化することはお勧めしません。ValueConverter を使用してそれを行うこともできますが、かなりハックになります。

よりクリーンなソリューションは、reportParameter のデータと OfficeList のインスタンスを含むクラスを作成し、UserControl にバインドする代わりに、そのクラスのインスタンスにバインドすることです。reportParameters の構造 (reportParameters は ReportParameter 型のオブジェクトのリストであると仮定します) に応じて、次の 2 つの方法があります。

1) ReportParameter が ViewModel の場合、OfficeList プロパティを ReportParameter クラスに追加するだけで、各 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 パラメータを追加するのは適切でない場合)、ReportParameter と OfficeList の 2 つのプロパティを含む ReportParameterViewModel のような名前の新しいクラスを作成します。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 に答える