Есть ли способ выбрать элементы в этом пользовательском TreeView в WPF? - PullRequest
1 голос
/ 05 ноября 2019

Я работаю над ответом на этот вопрос: Отображение элемента дерева в виде строк сетки в wpf , и я изо всех сил пытаюсь получить элементы в дереве, которые нужно выбрать. Как вы делаете это с этим типом кода? Спасибо

Я попытался вместо этого создать TextBlocks, TextBoxes, но безуспешно.

<TreeView x:Name="treeviewList"  ItemsSource="{Binding ManufacturerList}">
            <TreeView.ItemTemplate>
                <DataTemplate>
                    <TreeViewItem  ItemsSource="{Binding Models}">
                        <TreeViewItem.Header>
                            <Grid Width="350">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="100"></ColumnDefinition>
                                    <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>
                                    <ColumnDefinition ></ColumnDefinition>
                                </Grid.ColumnDefinitions>
                                <TextBlock Text="{Binding Task}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>
                                <TextBlock Text="{Binding durationTotal}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>
                                <TextBlock Text="{Binding HeadNote}" HorizontalAlignment="Left"  VerticalAlignment="Center"  Grid.Column="2"/>
                            </Grid>
                        </TreeViewItem.Header>
                        <TreeViewItem.ItemTemplate>
                            <DataTemplate>
                                <Grid Margin="-20,0,0,0">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="100"></ColumnDefinition>
                                        <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>
                                        <ColumnDefinition></ColumnDefinition>
                                    </Grid.ColumnDefinitions>

                                    <TextBlock Text="{Binding SubTask}" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>
                                    <TextBlock Text="{Binding Duration}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>
                                    <TextBlock Text="{Binding Notes}" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="2"/>
                                </Grid>
                            </DataTemplate>
                        </TreeViewItem.ItemTemplate>
                    </TreeViewItem>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

C # Code

public class Company
{
    public string Task { get; set; }
    public string durationTotal { get; set; }
    public string HeadNote { get; set; }
    public List<Model> Models { get; set; }
}
public class Model
{
    public string SubTask { get; set; }
    public string Duration { get; set; }
    public string Notes { get; set; }      
}
List<Company> ManufacturerList = new List<Company>();

        ManufacturerList.Add(new Company()
        {
            Task = "Coding",
            durationTotal = "4",
            HeadNote = "Coding Task",
            Models = new List<Model>()
            {new Model(){SubTask = "Write", Duration = "2", Notes ="It pays the bills" },
            new Model(){SubTask = "Compile", Duration = "1", Notes ="c# or go home" },
            new Model(){SubTask = "Test", Duration = "1", Notes ="works on my m/c" },}
        });


        ManufacturerList.Add(new Company()
        {
            Task = "Communicate",
            durationTotal = "2",
            HeadNote = "Communicate Task",
            Models = new List<Model>()
            {new Model(){SubTask = "Email", Duration = "0.5", Notes ="so much junk mail"  },
            new Model(){SubTask = "Blogs", Duration = "0.25", Notes ="blogs.msdn.com/delay" },
            new Model(){SubTask = "Twitter", Duration = "0.25", Notes ="RT:nothing to report" },}
        });

        treeviewList.ItemsSource = ManufacturerList;

1 Ответ

1 голос
/ 05 ноября 2019

Ваши элементы не могут быть выбраны, потому что они простые TextBlocks в пределах DataTemplate и поэтому не имеют никакого выбираемого поведения. Чтобы их можно было выбирать, они должны иметь тип TreeViewItem, потому что WPF обрабатывает их выбор.

Вам не следует шаблонировать TreeView вручную, как вы делаете, вместо этого следует использовать HierarchicalDataTemplateчтобы позволить TreeView создать свою коллекцию TreeViewItems следующим образом:

<TreeView ItemsSource="{Binding ManufacturerList}">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type wpfapp1:Company}" ItemsSource="{Binding Models}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"></ColumnDefinition>
                    <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>
                    <ColumnDefinition></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding Task}" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>
                <TextBlock Text="{Binding durationTotal}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>
                <TextBlock Text="{Binding HeadNote}" HorizontalAlignment="Left"  VerticalAlignment="Center"  Grid.Column="2"/>
            </Grid>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type wpfapp1:Model}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="80"></ColumnDefinition>
                    <ColumnDefinition Width="Auto" MinWidth="50"></ColumnDefinition>
                    <ColumnDefinition ></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <TextBlock Text="{Binding SubTask}" Margin="10,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Center" Grid.Column="0"/>
                <TextBlock Text="{Binding Duration}" Margin="10,0,10,0" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="1"/>
                <TextBlock Text="{Binding Notes}" HorizontalAlignment="Left" VerticalAlignment="Center"  Grid.Column="2"/>
            </Grid>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>

Что касается вашей необходимости выравнивания, я жестко закодировал Width="80" и Width="100", потому что у вас уже были жестко закодированные значения, ноЯ думаю, что это не тот путь (существуют более чистые решения).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...