绑定到动态对象时维护类型 - WPF / C#

时间:2016-02-03 19:53:46

标签: c# wpf

说我有一个这样的课......

public class Field
{
    public Field(string fieldname, object fieldValue = null)
    {
        FieldName = fieldname;
        FieldValue = fieldValue;
    }

    public string FieldName { get; set; }
    public object FieldValue { get; set; }

}

然后我就这样绑定到班级......

<Label Width="Auto" Content="{Binding FieldlName}"></Label>
<TextBox Width="Auto" Text="{Binding FieldValue, FallbackValue='error', UpdateSourceTrigger=PropertyChanged}"></TextBox>

我遇到一个问题,如果 FieldValue 在代码后面设置为整数,但是用户在文本框中键入不同的整数,则该类型会更改为字符串。

但是,我期望值保持其类型。

我意识到问题是Text属性是字符串,并且它尝试进行转换。

因此,我正在寻找的是维持隐式类型,某种验证,某种转换器,吸气剂上的某种东西的补救措施......这是我不完全确定的事情?

1 个答案:

答案 0 :(得分:1)

文本框的值始终是字符串,无法更改(除非您使用其他组件)。但是,WPF绑定引擎在更新绑定属性时会尝试转换类型。

当您的视图模型的属性类型为string时,目标类型与源的类型(文本字段的文本属性)匹配,因此所有内容都已更新。

因此,当您的视图模型的属性类型为int时,无论您在文本框中输入的内容都将尝试转换为int。如果有效,那很好;如果不是,则不更新视图模型属性,而是抛出绑定异常。

现在,当您的视图模型的属性类型为object时,当WPF尝试将字符串值存储到视图模型的属性中时,那就可以了。无论它以前的值(无论是int还是任何其他对象)。由于stringobject的子类型,因此引擎只能将字符串分配给object属性,因此不会发生类型转换。