3

うまくいけば、簡単な質問です。別のカスタム コントロールのリストを含む依存関係プロパティを持つカスタム コントロールがあります。

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); }
}

次に、これを xaml 内で使用してコントロールを設定します

<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>

私の問題は、これをファイルにシリアル化したいのですが、XamlWriter.Save を使用すると、「ジェネリック型 'System.Windows.FreezableCollection` をシリアル化できません」というメッセージが表示されることです。これが通常のクラスである場合、属性を使用してシリアル化する方法を記述できますが (そうですか?)、これは静的な依存関係プロパティなので、これをシリアル化するにはどうすればよいですか?

4

1 に答える 1

8

わかりました。愚かなことに、これに関する情報はネット全体にたくさんあります。簡単な解決策は、ジェネリックfreezablecollectionを取得し、以下のようにジェネリックなしのクラスを派生させることです。

public class BlockObjectCollection : FreezableCollection<BlockObject>
{
}

次に、依存関係のプロパティを置き換えます

    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); }
    }
于 2012-07-19T14:44:03.867 に答える