这是我的代码:
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}" />
似乎只考虑了第一个构造函数。为什么呢?
答案 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
。转换为bool
或int
由解析器在运行时执行。
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))
{
// ...
}
}