3 votes

Impossible de sérialiser un type générique 'System.Windows.FreezableCollection'.

Une question simple, j'espère. J'ai un contrôle personnalisé avec une propriété de dépendance qui contient une liste d'un autre contrôle personnalisé.

public static readonly DependencyProperty BlockObjectsProperty = DependencyProperty.Register("BlockObjects", typeof(FreezableCollection<BlockObject>), typeof(Block), new FrameworkPropertyMetadata(new FreezableCollection<BlockObject>(), null));
public FreezableCollection<BlockObject> BlockObjects
{
     get { return (FreezableCollection<BlockObject>)base.GetValue(BlockObjectsProperty); }
     set { base.SetValue(BlockObjectsProperty, value); }
}

Ceci est ensuite utilisé dans le xaml pour remplir les contrôles.

<Viewbox Grid.Row="2" Stretch="Uniform">
    <ItemsControl x:Name="tStack" ItemsSource="{TemplateBinding BlockObjects}" ContextMenu="{StaticResource BodyContextMenuKey}">
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel Orientation="Vertical"  VerticalAlignment="Stretch" />
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
     </ItemsControl>
</Viewbox>

Si c'était une classe normale, je pourrais utiliser des attributs pour décrire la manière dont elle doit être sérialisée (n'est-ce pas ?) mais c'est une propriété statique dépendante, alors comment puis-je la sérialiser ?

8voto

E.L Dunn Points 331

La solution la plus simple est de prendre la classe générique freezablecollection et de dériver une classe non générique comme ci-dessous.

public class BlockObjectCollection : FreezableCollection<BlockObject>
{
}

puis remplacez les propriétés de dépendance

    public static readonly DependencyProperty BlockObjectsProperty = DependencyProperty.Register("BlockObjects", typeof(BlockObjectCollection), typeof(Block), new FrameworkPropertyMetadata(new BlockObjectCollection(), null));
    public BlockObjectCollection BlockObjects
    {
        get { return (BlockObjectCollection)base.GetValue(BlockObjectsProperty); }
        set { base.SetValue(BlockObjectsProperty, value); }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X