Minimizing data stored by persistence framework

2 posts, 0 answers
  1. Douglas
    Douglas avatar
    1 posts
    Member since:
    Jan 2020

    Posted 13 Jan Link to this post

    We are using the PersistenceFramework to handle storing the user's settings in our application.  Currently the application consists of a single window that contains a RadWizard with three pages.  The first page gets the configuration options for the process, the second shows the progress of the operation, and the final page shows the results of the operation in a RadGridView.   We have worked around a few issues with the PersistenceFramework storing unwanted specific values (e.g. SelectedPage) by using SerializationOptions with the Except Condition.  Of course we used the Custom PropertiesProvider for the RadGridView.  This works in general; however, we have run into issues during development where, if you make a change in the XAML, (e.g. change the layout/presentation of the page) minor changes cause the saved properties to be incompatible and the application just crashes.  It then takes time to determine whether the problem is with the persistence or something the programmer did.

    What we would like to do is go to the Condition="Only" model of persistence.  This would allow us to specify the few things like window size and position, configuration settings, and the final RadGridView properties; and persist just those.  I have successfully trimmed the main window data down to the window size and position using the Only Condition.   However, when trying to work with items deeper in the page. I haven't been able to filter properly.  I either get nothing, or everything.

    I am looking for help on how persist the option from the first page and the RadGridView properties from the third page without the rest of the properties of either page or anything from the second page.

     

    001.<base:Window x:Class="CatalogCompare.CatalogCompareView"
    003.        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    004.        xmlns:base="clr-namespace:SSI.Base.UI;assembly=SSI.Base.UI"
    005.        xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation"
    006.        xmlns:telerik1="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls"
    007.        xmlns:persist="clr-namespace:SSI.Base.UI.Persistence;assembly=SSI.Base.UI"
    008.        xmlns:radGridContextMenu="clr-namespace:SSI.Base.UI.Controls.RadGridContextMenu;assembly=SSI.Base.UI"
    009.        xmlns:sys="clr-namespace:System;assembly=mscorlib"
    010.        xmlns:behaviors="clr-namespace:CatalogCompare"
    011.        Title="Catalog Compare"
    012.        Height="440"
    013.        Width="617"
    014.        MinHeight="440"
    015.        MinWidth="617"
    016.        Icon="pack://application:,,,/SSI.Images;component/Images/CatalogCompare.ico">
    017.    <telerik:PersistenceManager.SerializationOptions>
    018.        <telerik:SerializationMetadataCollection>
    019.            <telerik:PropertyNameMetadata Condition="Only" Expression="^\b(Top)\b$" SearchType="PropertyPath" />
    020.            <telerik:PropertyNameMetadata Condition="Only" Expression="^\b(Left)\b$" SearchType="PropertyPath" />
    021.            <telerik:PropertyNameMetadata Condition="Only" Expression="^\b(Width)\b$" SearchType="PropertyPath" />
    022.            <telerik:PropertyNameMetadata Condition="Only" Expression="^\b(Height)\b$" SearchType="PropertyPath" />
    023.        </telerik:SerializationMetadataCollection>
    024.    </telerik:PersistenceManager.SerializationOptions>
    025.    <Window.Resources>
    026....
    027.    </Window.Resources>
    028.    <Grid x:Name="LayoutRoot">
    029.        <telerik:RadWizard x:Name="wizard" Cancel="wizard_Cancel" Finish="wizard_Export" SelectedPageIndex="{Binding SelectedWizardPageIndex, Mode=TwoWay}" IsContentPreserved="True">
    030.            <telerik:PersistenceManager.SerializationOptions>
    031.                <telerik:SerializationMetadataCollection>
    032.                    <telerik:PropertyNameMetadata Condition="Except" Expression="SelectedPage" SearchType="PropertyName" />
    033.                </telerik:SerializationMetadataCollection>
    034.            </telerik:PersistenceManager.SerializationOptions>
    035.            <telerik:RadWizard.WizardPages>
    036.                <telerik:WizardPage x:Name="configurePage" IsSideHeaderVisible="True" ButtonsVisibilityMode="Next,Cancel" NextButtonContent="Compare" IsTitleVisible="False" SideHeaderWidth="120" HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch" SideHeaderTemplate="{StaticResource sideHeaderTemplate}" HeaderTemplate="{StaticResource headerTemplate}" Template="{StaticResource WizardPageTemplate }" behaviors:CatalogComparePageBehavior.IsEnabled="True">
    037.                    <Grid Margin="5">
    038.                        <Grid.RowDefinitions>
    039.                            <RowDefinition Height="Auto"/>
    040.                            <RowDefinition Height="Auto"/>
    041.                        </Grid.RowDefinitions>
    042.                        <StackPanel>
    043.                            <TextBlock Grid.Column="0" Text="Catalog Compare Options" FontSize="14" FontWeight="Bold"/>
    044.                            <TextBlock Margin="10,10,0,0" Grid.Column="0" Text="Compare Type (Missing)" FontSize="12" FontWeight="DemiBold"/>
    045.                            <RadioButton  Margin="10,5,0,0" GroupName="CompareType" Content="ID Only" IsChecked="{Binding GuidOnlyCompareType}"  ToolTip="Find catalog items by ID (GUID) only; catalog items with the same name but different IDs will show as missing"/>
    046.                            <RadioButton Margin="10,5,0,0" GroupName="CompareType" Content="WorkShare Transfer/Project/Design" IsChecked="{Binding WorkShareCompareType}" ToolTip="Find catalog items with WorkShare matching if an ID (GUID) match is not found"/>
    047.                        </StackPanel>
    048.                    </Grid>
    049.                </telerik:WizardPage>
    050.                <telerik:WizardPage x:Name="progressPage" IsSideHeaderVisible="True" ButtonsVisibilityMode="Cancel" AllowNext="False" IsTitleVisible="False" SideHeaderWidth="120" SideHeaderTemplate="{StaticResource sideHeaderTemplate}"  HeaderTemplate="{StaticResource headerTemplate}" Template="{StaticResource WizardPageTemplate}" behaviors:CatalogComparePageBehavior.IsEnabled="True">
    051.                    <Grid>
    052.                        <Grid.ColumnDefinitions>
    053.                            <ColumnDefinition Width="61"/>
    054.                            <ColumnDefinition Width="350"/>
    055.                        </Grid.ColumnDefinitions>
    056.                        <StackPanel Margin="0,20,0,0"  Grid.Column="1">
    057.                            <telerik:PersistenceManager.SerializationOptions>
    058.                                <telerik:SerializationMetadataCollection>
    059.                                    <telerik:PropertyNameMetadata Condition="Except" Expression="Children" SearchType="PropertyName" />
    060.                                </telerik:SerializationMetadataCollection>
    061.                            </telerik:PersistenceManager.SerializationOptions>
    062.                            <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Comparing Project Catalogs..."/>
    063.                            <telerik:RadProgressBar Value="{Binding ProgressPercentage}"  Width="350" Minimum="0" Maximum="100" HorizontalAlignment="Left" VerticalAlignment="Center" Height="20" BorderThickness="2" BorderBrush="{StaticResource SSIGreyDark.Brush}" Foreground="{StaticResource SSIBlueDark.Brush}" />
    064.                            <TextBlock Text="{Binding ProgressText}" VerticalAlignment="Center" HorizontalAlignment="Center" />
    065.                        </StackPanel>
    066.                    </Grid>
    067.                </telerik:WizardPage>
    068.                <telerik:CompletionWizardPage x:Name="resultsPage" IsSideHeaderVisible="True" ButtonsVisibilityMode="Finish,Cancel" IsTitleVisible="False" AllowFinish="{Binding ShowResultsGrid}" FinishButtonContent="Export" CancelButtonContent="Close" SideHeaderWidth="120" SideHeaderTemplate="{StaticResource sideHeaderTemplate}"  HeaderTemplate="{StaticResource headerTemplate}" Template="{StaticResource WizardPageTemplate}"  behaviors:CatalogComparePageBehavior.IsEnabled="True">
    069.                    <telerik:PersistenceManager.SerializationOptions>
    070.                        <telerik:SerializationMetadataCollection>
    071.                            <telerik:PropertyNameMetadata Condition="Except" Expression="AllowFinish" SearchType="PropertyName" />
    072.                        </telerik:SerializationMetadataCollection>
    073.                    </telerik:PersistenceManager.SerializationOptions>
    074.                    <Grid>
    075.                        <TextBlock  Text="No catalog differences detected" FontSize="16" FontWeight="DemiBold" Margin="10,20,0,0" HorizontalAlignment="Left" Visibility="{Binding ShowNoCatalogChanges, Converter={StaticResource BooleanToVisibilityConverter}}">
    076.                            <telerik:PersistenceManager.SerializationOptions>
    077.                                <telerik:SerializationMetadataCollection>
    078.                                    <telerik:PropertyNameMetadata Condition="Except" Expression="Visibility" SearchType="PropertyName" />
    079.                                </telerik:SerializationMetadataCollection>
    080.                            </telerik:PersistenceManager.SerializationOptions>
    081.                        </TextBlock>
    082.                        <base:BaseRadGridView Name="_grid"
    083.                            GroupRenderMode="Flat"
    084.                            AutoGenerateColumns="False"
    085.                            ItemsSource="{Binding CatalogEntryList}"
    086.                            Grouping="GridGrouping"
    087.                            AutoExpandGroups="False"
    088.                            persist:Persist.PersistColumnGroups="True"
    089.                            persist:Persist.PersistColumnSorting="True"
    090.                            ShowGroupPanel="True"
    091.                            Margin="-3,-3,-3,-3"
    092.                            AlternateRowBackground="#FFF4F4F4"
    093.                            AlternationCount="2"
    094.                            Visibility="{Binding ShowResultsGrid, Converter={StaticResource BooleanToVisibilityConverter}}">
    095.                            <telerik:RadContextMenu.ContextMenu>
    096.                                <radGridContextMenu:RadGridContextMenu x:Name="_contextMenu" ExportOptionIsVisible="False"  />
    097.                            </telerik:RadContextMenu.ContextMenu>
    098.                            <telerik:RadGridView.Columns>
    099.                                <telerik:GridViewDataColumn DataMemberBinding="{Binding DatasetCategory}"
    100.                                                Header="Category"
    101.                                                ShowColumnWhenGrouped="True"
    102.                                                DisplayIndex="0"
    103.                                                ShowToolTipOnTrimmedText="True"
    104.                                                UniqueName="Category"
    105.                                                Width="100"/>
    106....
    107.                            </telerik:RadGridView.Columns>
    108.                        </base:BaseRadGridView>
    109.                    </Grid>
    110.                </telerik:CompletionWizardPage>
    111.            </telerik:RadWizard.WizardPages>
    112.        </telerik:RadWizard>
    113.    </Grid>
    114.</base:Window>
  2. Martin Ivanov
    Admin
    Martin Ivanov avatar
    2480 posts

    Posted 16 Jan Link to this post

    Hello Douglas,

    The persistence framework is trying to save anything from the visual tree of the parent element that is saved. There is no direct mechanism to disable this functionality and provide only properties that should be saved per control. You can try to achieve this with custom property providers, but this should be implemented for every type in the visual tree hierarchy, in order to ensure no redundant properties are saved.

    To achieve your requirement you can use the PropertyPersisting event of the PersistenceManager class and cancel the persisting for all properties, except the ones you need to save. Here is an example in code:

    PersistenceManager manager = new PersistenceManager();
    manager.PropertyPersisting += Manager_PropertyPersisting;

    private void Manager_PropertyPersisting(object sender, Telerik.Windows.Persistence.Events.PersistingPropertyEventArgs e)
    {
    	if (the property should not be saved)
    	{
    		e.Cancel = true;
    	}            
    }

    Regards,
    Martin Ivanov
    Progress Telerik

    Get quickly onboarded and successful with your Telerik and/or Kendo UI products with the Virtual Classroom free technical training, available to all active customers. Learn More.
Back to Top