OneWayToSource
绑定似乎打破了.NET 4.0OneWayToSource绑定似乎打破了.NET 4.0
我有这个简单的一块XAML中
<StackPanel>
<TextBox Text="{Binding TextProperty, Mode=OneWayToSource}"/>
<Button/>
</StackPanel>
和我后面的代码看起来像这样
public MainWindow()
{
InitializeComponent();
this.DataContext = this;
}
private string m_textProperty;
public string TextProperty
{
get
{
return "Should not be used in OneWayToSource Binding";
}
set
{
m_textProperty = value;
}
}
在.NET 3.5中这可以像你可能除外。放入TextBox
一些文本,按Tab键使其失去焦点,而TextProperty
更新与任何文本是在TextBox
进入在.NET 4.0,如果我键入TextBox
一些文字,然后按选项卡使它失去焦点,TextBox
恢复为TextProperty
(意思是“不应用于OneWayToSource绑定”)的值。这是否重新阅读了.NET 4.0中的OneWayToSource
Binding?我只是想TextBox
将其价值推到TextProperty
而不是相反。
更新
加入悬赏这个问题,因为这已经成为我的项目市长不便,我想知道,这种情况已经改变的原因。看起来,绑定已更新源后调用get
。这是在.NET 4.0中绑定的OneWayToSource
所需的行为吗?
如果是
- 知道是怎么在3.5的工作方式的问题?
- 这种新行为在哪些情况下更好?
或者是这样,其实我们可以希望错误得到固定在未来的版本?
我的猜测是为了反映您在设置过程中可能应用的任何过滤,以便TextBox的内容实际上反映了“真正”设置的值。然后,OneWayToSource唯一不同的地方是它只会在应用set()之后调用get(),而不是在发送属性更改通知时调用get()。 – 2011-02-02 15:46:40
在一个侧面说明中,一个以这种方式行为的属性(它暴露了一个getter,但get与设置的内容完全无关)是一个相当的病态属性。这听起来像你真正想要的是一个方法,但是打包为一个属性以允许绑定系统触发该呼叫。这可能是值得研究创建一个自定义行为,因为这样你就不必滥用财产制度。 – 2011-02-02 15:51:28
@丹·布莱恩特:你在评论戴维的回答还是你在回答这个问题? :)我应该补充说,如果你删除了getter,那么每当`LostFocus`被引发时,`TextBox`都会一直是空白的。当然,这不可能是“OneWayToSource”绑定的理想方式,或者您认为如何? – 2011-02-02 17:04:29