0

オブジェクトをロードして適切に表示する階層データテンプレートを備えたWPFツリービューがあります。ツリービューの子の中で、TextBlockを使用して、ツリービューのオブジェクトの「名前」とその横にあるチェックボックスを表示しています。参考までに私のコードは次のとおりです。

<DockPanel Name="test1" Margin="10,10,0,10" VerticalAlignment="Stretch" Grid.Row="3" Grid.RowSpan="7" Grid.Column="0">
        <DockPanel.Resources>
            <local:CheckBoxCommand x:Key="cbc"></local:CheckBoxCommand>
            <src:TreeViewFilter x:Key="MyList" />

            <HierarchicalDataTemplate DataType="{x:Type src:TreeViewParent}" ItemsSource="{Binding Path=OrderAttributes}">
                <TextBlock Text="{Binding Path=NameAndCount}" FontSize="24"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type src:OrderAttribute}" ItemsSource="{Binding Path=OrderAttributes}">
                <StackPanel Name="test" Orientation="Horizontal" VerticalAlignment="Center">
                    <CheckBox Command="{StaticResource cbc}"
                              CommandParameter="{Binding Path=NameAndParent}" Visibility="{Binding Path=CheckBoxVisible}" VerticalAlignment="Center">
                    </CheckBox>
                    <TextBlock Text="{Binding Path=NameAndCount}" FontSize="16"/>
                    </StackPanel>
            </HierarchicalDataTemplate>

        </DockPanel.Resources>
        <TreeView Name="treeView1" BorderThickness="2" ItemsSource="{Binding Source={StaticResource MyList}, UpdateSourceTrigger=PropertyChanged}" TreeViewItem.Selected="filterByBatchStatus"/>
    </DockPanel>

ユーザーがツリーのチェックボックスをオンにすると、どのチェックボックスがオンになっているかに基づいて、アプリケーションで特定の処理が実行されます。どのチェックボックスがチェックされているかを知る方法は、コマンドを介してパラメーターを渡すことであり、そのパラメーターはオブジェクトの「NameAndParent」にバインドされます。これはすべて正常に機能します。

私の問題は、チェックされているチェックボックスを保存するオプションをユーザーに提供し、チェックされたボックスの横にある各オブジェクトの「名前」をXMLに保存すると始まります。ご覧のとおり、オブジェクトの「名前」のみを保存していますが、この名前にはチェックボックスへのフックがないため、戻って関連するチェックボックスを「検索」することはできません。

これらの保存されたファイルの1つをロードするオプションをユーザーに与えるとき、ツリーをトラバースして、保存されたチェックボックスをオンにします。問題は、チェックボックスに名前、またはUIDがないことです。これは許可されていないため、バインドによって割り当てることができません。

ツリービューをトラバースして、保存された名前をツリー内の各要素の子の名前と比較し、その特定のチェックボックスをオンにする方法はありますか、それとも別の方法でプログラムする必要がありますか?

4

1 に答える 1

1

データを含むクラスにブールIsCheckedプロパティを作成し、CheckBox.IsCheckedをそれにバインドするだけです。ビューを操作する代わりに、バインドされているデータをより簡単に操作して、凝ったVisual-Tree操作の必要性をなくし、アプリケーションロジックとUIの間の依存関係を取り除くことができます。これは、Model-View-ViewModelパターンの最も重要な実現です。

UI関連のロジック(前述のIsCheckedプロパティなど)をデータモデルに導入したくない場合は、モデルとビューの間にViewModelを導入する必要があります。

于 2012-10-30T20:00:17.030 に答える