WPF重载自定义绑定构造函数

时间:2017-12-06 21:58:52

标签: c# wpf xaml

这是我的代码:

public class MyBinding : Binding {

    public MyBinding(string path, bool value) : base(path) { /*...*/ }

    public MyBinding(string path, int value) : base(path) { /*...*/ }

}

我可以这样做:

<Control Property="{MyBinding Variable, True}" />

但不能这样做:

<Control Property="{MyBinding Variable, 123}" />

似乎只考虑了第一个构造函数。为什么呢?

2 个答案:

答案 0 :(得分:3)

XAML处理器尝试调用它找到的第一个构造函数。如果你改变了构造函数的顺序或删除了第一个构造函数,则可以正常工作:

public class MyBinding : Binding
{
    public MyBinding(string path, int value) : base(path) { } //primary
    public MyBinding(string path, bool value) : base(path) { } //secondary
}

在XAML中,诸如“True”和“123”之类的值只是strings。转换为boolint由解析器在运行时执行。

XAML不是强类型编程语言。它是一种基于XML(文本)的标记语言。

即使您键入:

,Visual Studio中的工具提示也会显示Int32
{MyBinding Variable, xyz}

这并不意味着将xyz转换为System.Int32将在运行时成功。显然不会。

答案 1 :(得分:2)

您不会在构造函数上进行重载,但可以添加类型属性。

public class MyBinding : Binding
{
    public MyBinding(string path) : base(path)
    {
    }

    private int _intvalue = 0;
    public int IntValue { get => _intvalue; set { _intvalue = value; } }

    private string _stringvalue = null;
    public string StringValue { get => _stringvalue; set { _stringvalue = value; } }
}

XAML:

    <Label Content="{local:MyBinding SomeProperty, IntValue=123}" />
    <Label Content="{local:MyBinding SomeProperty, StringValue=123}" />

我不会选择这个解决方案,但它是一个选项:

public MyBinding(string path, string param) : base(path)
{
    int x;
    double d;
    bool b;
    if (Int32.TryParse(param, out x))
    {
        //  ...
    }
    else if (Double.TryParse(param, out d))
    {
        //  ...
    }
    else if (Boolean.TryParse(param, out b))
    {
        //  ...
    }
}