如何序列化具有ObservableCollection类型属性的WPF自定义控件?

时间:2016-09-13 08:10:24

标签: c# wpf xaml serialization

我正在编写WPF窗口设计器应用程序。 在设计器中,我可以向窗口添加customcontrols并通过序列化添加的自定义控件所在的Canvas面板来保存窗口。

public string SerializeControlToXaml(FrameworkElement control)
{
    StringBuilder outstr = new StringBuilder();

    XmlWriterSettings settings = new XmlWriterSettings();
    settings.Indent = true;
    settings.OmitXmlDeclaration = true;
    XamlDesignerSerializationManager dsm =
            new XamlDesignerSerializationManager(XmlWriter.Create(outstr, settings));
    dsm.XamlWriterMode = XamlWriterMode.Expression;
    System.Windows.Markup.XamlWriter.Save(control, dsm);

    string xaml = outstr.ToString();
    return xaml;
}

在序列化后,我将xaml作为字符串并将其保存在一个文件中,以后可以重新加载。

现在我的问题是我向我的一个自定义控件添加了一个新的依赖项属性,该类型是ObservableCollection类型。 每次我设置该属性并尝试将画布序列化为XAML时,我收到一条错误消息:

"< ObservableCollection 1'. The sign ''中的无效首字母,十六进制值0x60,可能不包含在名称中。"

我从不给这个系列起名。 出了什么问题?

这是我绑定控件的viewmodel-property:

public ObservableCollection<string> SelectedFormulas
{
    get
    {
        return selectedFormulas;
    }
    set
    {
        selectedFormulas = value;
        RaisePropertyChanged("SelectedFormulas");
    }
}

这是我的依赖属性:

public static readonly DependencyProperty SelectedFormulasProperty =
        DependencyProperty.Register("SelectedFormulas", typeof(ObservableCollection<string>), typeof(CustomNumericField));

public ObservableCollection<string> SelectedFormulas
{
    get { return GetValue(SelectedFormulasProperty) as ObservableCollection<string>; }
    set { SetValue(SelectedFormulasProperty, value); }
}

1 个答案:

答案 0 :(得分:1)

dbc的答案是解决方案。

我需要的是非泛型类而不是ObservableCollection。

这是新课程:

public class SelectedFormulaCollection : ObservableCollection<string>
{
}

这里是customcontrol中的DependencyProperty(viewmodel中属性的类型也必须改变!):

    public static readonly DependencyProperty SelectedFormulasProperty =
        DependencyProperty.Register("SelectedFormulas", typeof(SelectedFormulaCollection), typeof(CustomNumericField));

    public SelectedFormulaCollection SelectedFormulas
    {
        get { return GetValue(SelectedFormulasProperty) as SelectedFormulaCollection; }
        set { SetValue(SelectedFormulasProperty, value); }
    }