Древовидное представление Silverlight с несколькими TreeViewItemStyle

В зависимости от привязанного элемента я использую разные шаблоны данных для отображения данных. Теперь мне также нужно изменить поведение/стиль самого дерева. Можно ли переключать стиль элементов в зависимости от свойства объекта? Сейчас указан только один: ItemContainerStyle="{StaticResource TreeViewItemStyleFolder}"

Я хотел бы создать второй стиль TreeViewItemStyleDocument

Текущий XAML (с пользовательским стилем и селектором шаблона)

<sdk:TreeView ItemsSource="{Binding Items}" 
                      Grid.Row="1" 
                      Style="{StaticResource TreeViewStyle1}" 
                      ItemContainerStyle="{StaticResource TreeViewItemStyleFolder}"
                      >
            <sdk:TreeView.ItemTemplate>
                <sdk:HierarchicalDataTemplate ItemsSource="{Binding SubItems}">
                    <DocumentManagement:DocumentTreeViewItemTemplateSelector 
                        Content="{Binding}">
                        <DocumentManagement:DocumentTreeViewItemTemplateSelector.FolderTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="24" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>

                                    <!-- FOLDER ICON AND CAPTION -->
                                    <Image Source="{Binding IconSource}" Width="24" Height="24" />
                                    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" 
                                   Grid.Column="1" Margin="5,0"
                                   Text="{Binding Folder.FolderId}" FontSize="12" Foreground="#2C2C2C" />
                                </Grid>
                            </DataTemplate>
                        </DocumentManagement:DocumentTreeViewItemTemplateSelector.FolderTemplate>
                        <DocumentManagement:DocumentTreeViewItemTemplateSelector.DocumentTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="24" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>
                                    <StackPanel Grid.Column="1" Orientation="Horizontal">
                                        <TextBlock FontSize="10" Foreground="#2C2C2C">
                                            <Run Text="Added by" />
                                            <Run Text="{Binding Document.MEMUser.UserName}" />
                                            <Run Text=" on " />
                                            <Run Text="{Binding CreatedOn, Converter={StaticResource DateTimeToStringConverter}}" />
                                        </TextBlock>                                        
                                        <!--BIND COMMANDS TO PARENT ViewModel to process operations-->
                                        <Button Content="Delete" Command="{Binding DataContext.DeleteCommand, ElementName=LayoutRoot}" CommandParameter="{Binding}" />
                                        <Button Content="Download" Command="{Binding DataContext.DownloadCommand, ElementName=LayoutRoot}" CommandParameter="{Binding}" />
                                    </StackPanel>
                                </Grid>
                            </DataTemplate>
                        </DocumentManagement:DocumentTreeViewItemTemplateSelector.DocumentTemplate>
                    </DocumentManagement:DocumentTreeViewItemTemplateSelector>
                </sdk:HierarchicalDataTemplate>
            </sdk:TreeView.ItemTemplate>
        </sdk:TreeView>

ИЗМЕНИТЬ:

Добавлены триггеры для переключения ItemContainerStyle на основе свойства, но я думаю, что проблема в том, что я использую иерархический шаблон данных. Если я ставлю точку останова на свойство IsFolder - исходного объекта нет.

<sdk:TreeView x:Name="DocumentsTreeView" ItemsSource="{Binding Items}" 
                      Grid.Row="1" 
                      Style="{StaticResource TreeViewStyleTransparent}">
<!--            ItemContainerStyle="{StaticResource TreeViewItemStyleFolders}"-->
            <i:Interaction.Triggers>
                <ei:DataTrigger Value="False" Binding="{Binding IsFolder}">
                    <ei:ChangePropertyAction TargetName="DocumentTreeView" PropertyName="ItemContainerStyle"                
                                             Value="{StaticResource TreeViewItemStyleFolders}" />
                </ei:DataTrigger>
                <ei:DataTrigger Value="True" Binding="{Binding IsFolder}">
                    <ei:ChangePropertyAction TargetName="DocumentTreeView" PropertyName="ItemContainerStyle" 
                                             Value="{StaticResource TreeViewItemStyleDocuments}" />
                </ei:DataTrigger>
            </i:Interaction.Triggers>
            <sdk:TreeView.ItemTemplate>
                <sdk:HierarchicalDataTemplate ItemsSource="{Binding SubItems}">

                    <DocumentManagement:DocumentTreeViewItemTemplateSelector 
                        Content="{Binding}">
                        <DocumentManagement:DocumentTreeViewItemTemplateSelector.FolderTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="24" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>

                                    <!-- FOLDER ICON AND CAPTION -->
                                    <Image Source="{Binding IconSource}" Width="24" Height="24" />
                                    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Left" 
                                   Grid.Column="1" Margin="5,0"
                                   Text="{Binding Folder.FolderId}" FontSize="12" Foreground="#2C2C2C" />
                                </Grid>
                            </DataTemplate>
                        </DocumentManagement:DocumentTreeViewItemTemplateSelector.FolderTemplate>
                        <DocumentManagement:DocumentTreeViewItemTemplateSelector.DocumentTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="24" />
                                        <ColumnDefinition Width="*" />
                                    </Grid.ColumnDefinitions>
                                    <StackPanel Grid.Column="1" Orientation="Horizontal">
                                        <TextBlock FontSize="10" Foreground="#2C2C2C">
                                            <Run Text="Added by" />
                                            <Run Text="{Binding Document.MEMUser.UserName}" />
                                            <Run Text="on" />
                                            <Run Text="{Binding Document.CreatedOn, Converter={StaticResource DateTimeToStringConverter}}" />
                                        </TextBlock>                                        
                                        <!--BIND COMMANDS TO PARENT ViewModel to process operations-->
                                        <Button Content="Delete" Command="{Binding DataContext.DeleteCommand, ElementName=LayoutRoot}" CommandParameter="{Binding}" />
                                        <Button Content="Download" Command="{Binding DataContext.DownloadCommand, ElementName=LayoutRoot}" CommandParameter="{Binding}" />
                                    </StackPanel>
                                </Grid>
                            </DataTemplate>
                        </DocumentManagement:DocumentTreeViewItemTemplateSelector.DocumentTemplate>
                    </DocumentManagement:DocumentTreeViewItemTemplateSelector>
                </sdk:HierarchicalDataTemplate>
            </sdk:TreeView.ItemTemplate>
        </sdk:TreeView>

person katit    schedule 09.05.2012    source источник
comment
Какое свойство объекта будет определять выбор шаблона стиля? Из того, что вы описываете, вы можете установить триггер для изменения свойства с именем цели на ваше древовидное представление и просто перевернуть свой ItemContainerStyle на лету с помощью changepropertyaction/datatrigger, возможно, но мне нужно немного больше информации, прежде чем я попытался предоставить некоторый код.   -  person Chris W.    schedule 06.06.2012
comment
Допустим, это будет свойство IsFolder, которое при значении true должно запускать один шаблон, а значение false будет другим шаблоном. Имейте в виду, что это Silverlight, а не WPF.   -  person katit    schedule 06.06.2012


Ответы (1)


Если я правильно понимаю, вы хотите, чтобы стиль динамически менялся в зависимости от значения свойства, и вы хотите, чтобы это выполнялось глобально для всех элементов на странице, ссылающихся на данный стиль?

Если это так, я бы посоветовал вам изучить раскадровки и состояния в Expression Blend. Я не вижу, чтобы вы упоминали Blend в своем описании. Вы используете его? В древовидном представлении есть много элементов, которые можно настроить, а есть и более сложные. На прошлой неделе у меня возникла проблема, связанная с тем, что мои гиперссылки, вложенные в древовидную структуру, не могли эффективно изменить цвет шрифта. Я, вероятно, мог бы сделать это, потратив больше времени на дизайн, но вместо этого я изменил замысел дизайна.

Предварительная версия Blend для Silverlight 5 бесплатна до июня 2013 года согласно моей установке. http://www.microsoft.com/en-us/download/details.aspx?id=9503

Удачи,

person Stainedart    schedule 04.06.2012