0

MainWindow.xamlに次のComboBoxがあります。

<ComboBox ItemsSource="{Binding ComboItemsProperty}" />

MainWindow.xaml.csの場合:

ObservableCollection<string> ComboItemsField = 
    new ObservableCollection<string>();
public ObservableCollection<string> ComboItemsProperty
{
    get { return ComboItemsField; }
    set { ComboItemsField = value; }
}

これは完璧に機能します!プロパティにアイテムを追加して、ComboBox要素を正常にシリアル化できます。

私の質問は、UserControl.xamlとUserControl.xaml.csにこの正確なコードがあるのに、コントロールをシリアル化しようとすると次のエラーが発生するのはなぜですか。

ジェネリック型'System.Collections.ObjectModel.ObservaleCollection'1[System.String]'をシリアル化できません

何かご意見は?

4

1 に答える 1

2

「ComboBox要素のシリアル化に成功した」とは言いませんが、エラーはUserControlsの予想される動作です。

XamlWriter(私はあなたが使用していると思います)バインディングをシリアル化できません。つまり、代わりにバインドされた実際の値をシリアル化しようとします。ジェネリック コレクションがバインドされているため、XamlWriterジェネリックをシリアル化できないため失敗します。

2 つのオプションがあります:XamlWriterプロパティをシリアル化しないことを伝えます。

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public ObservableCollection<string> ComboItemsProperty
{
    get { return ComboItemsField; }
    set { ComboItemsField = value; }
}

または、アイテムをバインドする必要がある場合は、ジェネリックから派生する独自の具象クラスを作成して、ジェネリックの問題を取り除きます。詳細については、この質問を参照してください。

于 2012-09-04T14:59:50.110 に答える