wpf treeview HierarchicalDataTemplate получить дочерний элемент управления - PullRequest
0 голосов
/ 28 февраля 2010

я использую эту статью http://blogs.msdn.com/delay/archive/2009/09/23/if-it-walks-like-a-duck-and-talks-like-a-duck-it-must-be-a-treegrid-a-simple-xaml-only-treegrid-ui-for-wpf.aspx

чтобы иметь иерархические данные ... у меня есть древовидная структура, которая содержит сетку, и эта сетка содержит текстовые поля ...

я просто хочу скрыть / показать некоторые столбцы во время выполнения сетки в древовидной структуре ... на любом уровне ... независимо от того, родительский или дочерний ...

1 Ответ

0 голосов
/ 28 февраля 2010

Один из способов сделать это - использовать концепцию ViewModel. ViewModel - это структура данных, которая представляет представление пользовательского интерфейса приложения, это модель (данные) + информация, обычно необходимая для пользовательского интерфейса.

В вашем примере у вас может быть новый класс, который оборачивает ваши данные (доступный через свойство, скажем, скажем, Model) и имеет дополнительные свойства, такие как логическое значение IsVisible. INotifyPropertyChanged должен быть реализован этим классом

Если я копирую и изменяю шаблон, указанный в упомянутой статье:

   <TreeView.ItemTemplate>

        <!-- Level 0 template leaves space for 2 child "Toggle" levels -->
        <HierarchicalDataTemplate ItemsSource="{Binding Model.SubItems}">
            <Grid Visibility={Binding IsVisible, Converter={StaticResource B2VConverter}}>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="Task"/>
                    <ColumnDefinition SharedSizeGroup="Toggle"/>
                    <ColumnDefinition SharedSizeGroup="Toggle"/>
                    <ColumnDefinition SharedSizeGroup="Duration"/>
                    <ColumnDefinition SharedSizeGroup="Notes"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Column="0" Text="{Binding Model.Task}" Style="{StaticResource TextBlockStyle}"/>
                <TextBlock Grid.Column="3" Text="{Binding Model.Duration}" Style="{StaticResource TextBlockStyle}"/>
                <TextBlock Grid.Column="4" Text="{Binding Model.Notes}" Style="{StaticResource TextBlockStyle}"/>
            </Grid>
        ... 

Новыми являются (я не могу выделить жирным шрифтом текст, который я добавил), настройка свойства IsVisible на уровне сетки и ссылки на свойство данных, где «Модель». был добавлен. Он связан с новым свойством IsVisible через конвертер, который вы должны объявить на уровне ресурсов:

Теперь вы модифицируете свою ViewModel, когда хотите скрыть или показать элемент в дереве. Так просто. Это грубое введение в способ программирования MVVM. Вы найдете много литературы об этом. У него довольно много преимуществ, таких как возможность модульного тестирования логики пользовательского интерфейса (т. Е. При каких обстоятельствах элемент дерева должен становиться видимым?).

Более простой, менее модульный способ сделать то, что вы запрашиваете, - добавить свойство IsVisible непосредственно в модель, но это не рекомендуется, так как смешивает яблоки и апельсины. Это может быть хорошо для очень маленькой программы, которая используется в течение нескольких дней, а затем выбрасывается.

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