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# 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

当声明此Xaml时

<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'}"/>