c# - XAML 序列化 - 需要指定属性

标签 c# xaml serialization

我正在尝试使用 XAML 来序列化/反序列化某些自定义(非 WPF/UI)信息,并希望强制要求某些属性。

默认情况下,XAML 反序列化仅使用默认构造函数创建每个对象,然后设置它在元素的属性或属性元素语法中找到的任何属性。未在被序列化的 XAML 中指定的基础对象的任何属性都保持原样,即它们在构造后获得的任何值。

我想知道指定某个属性必须存在于 XAML 中的最佳方式——如果不存在,反序列化将失败。

我期待某种属性,但我找不到任何东西。

WPF 中的某些类型确实表现出这种行为,但大概 WPF 使用它自己的自定义方式来强制执行这种行为。例如,如果你有..

<Setter Property="Height" ></Setter>

..设计者会提示“缺少属性“Value””。

我可以想到一些非常复杂的方法来做到这一点:

  1. 让每个属性 setter 以某种方式记录它被调用,然后在反序列化后运行自定义代码,检查是否实际设置了所有“必需”属性。

  2. 在任何地方都使用可为空的属性,然后在反序列化后检查是否有任何“必需”的属性仍然为空。 (当然,如果 null 是一个有效的设置对象,这将不起作用!)

  3. 也许有一种编写自定义 XamlObjectWriter 的方法,它可以检查对象属性的某些 [Required] 属性,如果 XamlReader 找不到这些属性,则失败。

这些听起来比我希望的要多得多 - 而且我相信还有更明显的方法。有没有人对这个问题有任何其他想法或经验(也许还有解决方案)?

最佳答案

我知道这已经过时了,但在我弄清楚之前不久,我在寻找一种方法来解决这个问题时遇到了这个问题。也许它会帮助别人。幸运的是这很容易:实现 ISupportInitialize .我正在使用 WPF,但它应该可以在任何地方使用。

public class Hero : ISupportInitialize
{
    public string Who
    { get; set; } = string.Empty;

    public string What
    { get; set; } = string.Empty;

    public string Where
    { get; set; } = string.Empty;

    public void BeginInit()
    {
        // set a flag here if your property setters
        // have dependencies on other properties
    }

    public void EndInit()
    {
        if (string.IsNullOrWhiteSpace(Who))
            throw new Exception($"The property \"Who\" is missing");
        if (string.IsNullOrWhiteSpace(What))
            throw new Exception($"The property \"What\" is missing");
        // Where is optional...
    }
}

WhoWhat 是必需的,但是第二个条目缺少 What:

<Window.Resources>
    <local:Hero x:Key="Badguy" Who="Vader" What="Sith" Where="Death Star"/>
    <local:Hero x:Key="Goodguy" Who="HanSolo" Where="Millenium Falcon"/>
</Window.Resources>

在 VS2017 XAML 标记编辑器中:

enter image description here

关于c# - XAML 序列化 - 需要指定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29000518/

相关文章:

c# - Connection must be valid and open错误

wpf - 覆盖切换按钮样式

c - 获取 avro 字符串时出错

c# - 如何使用 XElement.ToString() 包含声明

java - 使用动态键序列化 JSON 响应

c# - 为什么 WritePrivateProfileString 返回 0?

c# - 为什么在 Equals 方法中忽略了 Uri 的片段?

c# - 在大型应用程序中使用 MVVM - 共享 View 模型、模型、状态等

c# - 为 WPF DateTimePicker 验证设置区域性

.net - 如何将 WPF 资源分配给其他资源标签