我正在尝试使用 XAML 来序列化/反序列化某些自定义(非 WPF/UI)信息,并希望强制要求某些属性。
默认情况下,XAML 反序列化仅使用默认构造函数创建每个对象,然后设置它在元素的属性或属性元素语法中找到的任何属性。未在被序列化的 XAML 中指定的基础对象的任何属性都保持原样,即它们在构造后获得的任何值。
我想知道指定某个属性必须存在于 XAML 中的最佳方式——如果不存在,反序列化将失败。
我期待某种属性,但我找不到任何东西。
WPF 中的某些类型确实表现出这种行为,但大概 WPF 使用它自己的自定义方式来强制执行这种行为。例如,如果你有..
<Setter Property="Height" ></Setter>
..设计者会提示“缺少属性“Value””。
我可以想到一些非常复杂的方法来做到这一点:
让每个属性 setter 以某种方式记录它被调用,然后在反序列化后运行自定义代码,检查是否实际设置了所有“必需”属性。
在任何地方都使用可为空的属性,然后在反序列化后检查是否有任何“必需”的属性仍然为空。 (当然,如果 null 是一个有效的设置对象,这将不起作用!)
也许有一种编写自定义 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...
}
}
Who
和 What
是必需的,但是第二个条目缺少 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 标记编辑器中:
关于c# - XAML 序列化 - 需要指定属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29000518/