Разработка флажков в привязанных к данным листьях WPF в виде дерева - PullRequest
0 голосов
/ 22 ноября 2011

У меня есть следующее древовидное представление 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>

Эта структура исправлена.Затем я связываю низкоуровневые TreeViewItems, используя такой код:

        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();
        ...

Проблема в том, что мне нужно добавить один флажок на каждый узел (низкий и высокий уровень).Я искал решение, и лучшим из них является использование HierarchicalDataTemplate.Но я никогда не нашел пример с фиксированными и динамическими узлами одновременно.Я попробовал несколько примеров, но не смог решить.

Можете ли вы помочь мне в этом?

Заранее спасибо.

С уважением.

1 Ответ

0 голосов
/ 22 ноября 2011

Я бы сделал это, используя вспомогательный класс, представляющий элементы, которые можно проверить (некоторые называют это «моделью представления»):

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();

И это должно сработать.

...