C# MarkupExtension声明中的默认构造函数参数 把这个问题减到最小值,考虑这个标记扩展类… public class ProblemStatement : MarkupExtension { private readonly string _first; private readonly string _second; public ProblemStatement(string first, string second) { _first = first; _second = second; } public override object ProvideValue(IServiceProvider serviceProvider) { return this; } public override string ToString() { return _first + _second; } }
当声明此Xaml时C# MarkupExtension声明中的默认构造函数参数 把这个问题减到最小值,考虑这个标记扩展类… public class ProblemStatement : MarkupExtension { private readonly string _first; private readonly string _second; public ProblemStatement(string first, string second) { _first = first; _second = second; } public override object ProvideValue(IServiceProvider serviceProvider) { return this; } public override string ToString() { return _first + _second; } },c#,wpf,xaml,markup-extensions,C#,Wpf,Xaml,Markup Extensions,当声明此Xaml时 <Grid> <TextBlock Name="TextBlock1" Tag="{so:ProblemStatement 'hello', 'world'}"/> <TextBlock Text="{Binding ElementName=TextBlock1, Path=Tag}"/> </Grid> …以及与此相关的Xaml public ProblemStatement(string first, st
<Grid>
<TextBlock Name="TextBlock1" Tag="{so:ProblemStatement 'hello', 'world'}"/>
<TextBlock Text="{Binding ElementName=TextBlock1, Path=Tag}"/>
</Grid>
…以及与此相关的Xaml
public ProblemStatement(string first, string second = "nothing")
<Grid>
<TextBlock Name="TextBlock1" Tag="{so:ProblemStatement 'hello'}"/>
<TextBlock Text="{Binding ElementName=TextBlock1, Path=Tag}"/>
</Grid>
有一个解决方法,就是通过将此语句添加到类来链接构造函数
public ProblemStatement(string first) : this(first, "not provided") { }
这将在文本块中显示“Hello未提供”。然而,这也改变了MarkupExtension的语义,在更大的“真实世界”案例中是不可取的。此外,当使用更复杂的类型或构造函数参数的类型为“dynamic”时,重载的复杂性会显著增加。此外,例如,新的“呼叫者信息”属性的使用被完全阻止
因此,问题是:如何声明Xaml,以便Xaml解析器接受默认构造函数参数 试试这个:
public string Optional{ get; set; } = "DefaultValue";
private readonly string _mandatory;
public ProblemStatement(string mandatory)
{
_mandatory = mandatory;
}
用法:
<TextBlock Name="TextBlock1" Tag="{local:ProblemStatement 'hello', Optional=NotDefault}"/>
备选方案:
<TextBlock Name="TextBlock1" Tag="{local:ProblemStatement 'hello'}"/>
结果:
- 没有XAML解析错误
- 无需为可选参数重载构造函数
- 强制参数是构造函数参数
- 可选参数是属性
ConstructorArgumentAttribute
提供了什么好处,因为名为Optional的属性实际上不是构造函数参数?我认为ConstructorArgumentAttribute
是为了更好地告知XAML序列化实际构造函数arg和属性之间的关系。@AdamCaviness没有。当时我对这个属性有错误的印象。答案已相应编辑。
<TextBlock Name="TextBlock1" Tag="{local:ProblemStatement 'hello'}"/>