2016-04-08 4 views
0

есть способ сохранить состояние древовидной структуры (расширенные и выбранные свойства), чтобы сохранить состояние во время навигации и надгробной плиты приложения?WinRT XAML Toolkit TreeView Сохранить состояние

Я не хочу добавлять такую ​​информацию об источниках данных, поскольку семантически это два разных критерия. ItemSource - объект домена, не имеющий отношения с расширенным состоянием.

спасибо.

ответ

0

Вы можете сохранить эту информации внутри ViewModel, связанный с каждым узлом дерева, как это:

public class PersonViewModel 
{ 
    readonly List<Person> _children = new List<Person>(); 
    private bool _isExpanded; 

    public IList<Person> Children 
    { 
     get { return _children; } 
    } 

    public string Name { get; set; } 

    /// <summary> 
    /// Gets/sets whether the TreeViewItem 
    /// associated with this object is expanded. 
    /// </summary> 
    public bool IsExpanded 
    { 
     get { return _isExpanded; } 
     set 
     { 
      if (value != _isExpanded) 
      { 
       _isExpanded = value; 
       this.OnPropertyChanged("IsExpanded"); 
      }    
     } 
    } 
} 

Затем вы можете связать эти свойства с видом.

<TreeView ItemsSource="{Binding Persons}"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type PersonViewModel}"> 
     <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" /> 
     <Style.Triggers> 
      <Trigger Property="IsSelected" Value="True"> 
       <Setter Property="FontWeight" Value="Bold" /> 
      </Trigger> 
     </Style.Triggers> 
     </Style> 
    </TreeView.ItemContainerStyle> 

    <TreeView.Resources> 
     <HierarchicalDataTemplate DataType="{x:Type local:PersonViewModel}" 
            ItemsSource="{Binding Children}"> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}" /> 
      </StackPanel> 
     </HierarchicalDataTemplate> 

     <DataTemplate DataType="{x:Type local:PersonViewModel}"> 
      <StackPanel>     
       <TextBlock Text="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 
    </TreeView.Resources> 
</TreeView> 

http://www.codeproject.com/Articles/26288/Simplifying-the-WPF-TreeView-by-Using-the-ViewMode


Но то, что вы ищете:

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

<Page 
    x:Class="DataCloner.Uwp.Shell" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:DataCloner.Uwp" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:views="using:DataCloner.Uwp.Views" 
    mc:Ignorable="d"> 

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <Grid> 
      <views:TopBarView/> 
     </Grid> 
     <SplitView x:Name="rootSplitView" Content="{Binding myContentView}" DisplayMode="Inline" IsPaneOpen="True" Grid.Row="1" 
       OpenPaneLength="300"> 
      <SplitView.Pane> 
       <views:MenuPanelView/> 
      </SplitView.Pane>     
     </SplitView> 
    </Grid> 
</Page>