0

次の WPF ツリービューがあります。

        <TreeView HorizontalAlignment="Left" Margin="6,0,0,32" Name="tvProductos" Width="158">
            <TreeViewItem Header="Securities" IsExpanded="True" FontWeight="Bold">
                <TreeViewItem Header="Country" Name="Country" FontWeight="Normal" />
                <TreeViewItem Header="Currency" Name="Currency" FontWeight="Normal" />
                <TreeViewItem Header="Type" Name="Type" FontWeight="Normal" />
                <TreeViewItem Header="ISIN" Name="ISIN" FontWeight="Normal" />
                <TreeViewItem Header="Description" Name="Description" FontWeight="Normal" />
            </TreeViewItem>
            <TreeViewItem Header="Issuer" IsExpanded="True" FontWeight="Bold">
                <TreeViewItem Header="Name" Name="IssuerName" FontWeight="Normal" />
                <TreeViewItem Header="Type" Name="IssuerType" FontWeight="Normal" />
                <TreeViewItem Header="Market" Name="IssuerMarket" FontWeight="Normal" />
            </TreeViewItem>
        </TreeView>

この構造は固定されています。次に、次のようなコードを使用して低レベルの TreeViewItem をバインドします。

        Country.ItemsSource = (from d in db.PAISES
                               join p in db.PRODUCTOS on d.IDPAIS equals p.IDPAIS
                               select d.NOMBREPAIS).Distinct();
        Currency.ItemsSource = (from d in db.DIVISAS
                                join p in db.PRODUCTOS on d.IDDIVISA equals p.IDDIVISA
                                select d.NOMBREDIVISA).Distinct();
        Type.ItemsSource = (from d in db.TIPOSPRODUCTO
                            join p in db.PRODUCTOS on d.IDTIPOPRODUCTO equals p.IDTIPOPRODUCTO
                            select d.NOMBRETIPOPRODUCTO).Distinct();
        ...

問題は、各ノード (低レベルと高レベル) に 1 つのチェックボックスを追加する必要があることです。私は解決策を探していましたが、最善の解決策は HierarchicalDataTemplate を使用することです。しかし、固定ノードと動的ノードを同時に使用する例は見つかりませんでした。いくつかの例で試しましたが、解決できませんでした。

これについて私を助けてもらえますか?

前もって感謝します。

敬具。

4

1 に答える 1

0

私が行う方法は、チェックできる項目を表すヘルパー クラスを使用することです (「ビュー モデル」と呼ぶ人もいます)。

public class SelectableItem
{
    public bool IsSelected { get; set; }
    public string Label { get; set; }
}

これによりDataTemplate、この特定のタイプに を指定できます。

<TreeView HorizontalAlignment="Left" Margin="6,0,0,32" Name="tvProductos" Width="158">
    <TreeView.Resources>
        <DataTemplate DataType="{x:Type local:SelectableItem}" xmlns:local="clr-namespace:WpfApplication1">
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding IsSelected}" />
                <TextBlock Text="{Binding Label}" />
            </StackPanel>
        </DataTemplate>
    </TreeView.Resources>
    <TreeViewItem Header="Securities" IsExpanded="True" FontWeight="Bold">
        <TreeViewItem Header="Country" Name="Country" FontWeight="Normal" />
        <TreeViewItem Header="Currency" Name="Currency" FontWeight="Normal" />
        <TreeViewItem Header="Type" Name="Type" FontWeight="Normal" />
        <TreeViewItem Header="ISIN" Name="ISIN" FontWeight="Normal" />
        <TreeViewItem Header="Description" Name="Description" FontWeight="Normal" />
    </TreeViewItem>
    <TreeViewItem Header="Issuer" IsExpanded="True" FontWeight="Bold">
        <TreeViewItem Header="Name" Name="IssuerName" FontWeight="Normal" />
        <TreeViewItem Header="Type" Name="IssuerType" FontWeight="Normal" />
        <TreeViewItem Header="Market" Name="IssuerMarket" FontWeight="Normal" />
    </TreeViewItem>
</TreeView>

必要なのは、データ ソースを少し変更することだけです。

Country.ItemsSource = (from d in db.PAISES
                       join p in db.PRODUCTOS on d.IDPAIS equals p.IDPAIS
                       select new SelectableItem { Label = d.NOMBREPAIS }).Distinct();

そして、それはうまくいくはずです。

于 2011-11-22T09:16:03.537 に答える