说我有一个这样的课......
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
属性是字符串,并且它尝试进行转换。
因此,我正在寻找的是维持隐式类型,某种验证,某种转换器,吸气剂上的某种东西的补救措施......这是我不完全确定的事情?
答案 0 :(得分:1)
文本框的值始终是字符串,无法更改(除非您使用其他组件)。但是,WPF绑定引擎在更新绑定属性时会尝试转换类型。
当您的视图模型的属性类型为string
时,目标类型与源的类型(文本字段的文本属性)匹配,因此所有内容都已更新。
因此,当您的视图模型的属性类型为int
时,无论您在文本框中输入的内容都将尝试转换为int。如果有效,那很好;如果不是,则不更新视图模型属性,而是抛出绑定异常。
现在,当您的视图模型的属性类型为object
时,当WPF尝试将字符串值存储到视图模型的属性中时,那就可以了。无论它以前的值(无论是int还是任何其他对象)。由于string
是object
的子类型,因此引擎只能将字符串分配给object
属性,因此不会发生类型转换。