为什么单向数据绑定会出现问题?

10

这是一个小的XAML片段。您会看到

<StackPanel>
     <TextBox x:Name="txtValue">250</TextBox>
     <Slider x:Name="slide" 
             Value="{Binding ElementName=txtValue, Path=Text, 
                             Mode=OneWay, UpdateSourceTrigger=PropertyChanged}" 
            Minimum="0" Maximum="500"></Slider>
</StackPanel>
  1. 当你改变文本框的值时,滑块会更新。
  2. 如果你显式地更改滑块的值,则之前的行为将被破坏,也就是停止工作。

如果我移除Mode=OneWay指令(默认为双向),一切都可以完美地工作。

为什么会发生这种情况?

3个回答

13

使用 mode=TwoWay 并将 UpdateSourceTrigger=Explicit 设置为显式。


2
您的数据绑定并没有损坏,而是被停用了(http://en.wikipedia.org/wiki/Euphemism):
System.Windows.Data Warning: 75 : BindingExpression (hash=52697953): Deactivate
System.Windows.Data Warning: 99 : BindingExpression (hash=52697953): Replace item at level 0 with {NullDataItem}
System.Windows.Data Warning: 59 : BindingExpression (hash=52697953): Detach

将跟踪级别设置为高,如果您移动滑块,则会在VS输出窗口中产生此消息。
<Slider xmlns:trace="clr-namespace:System.Diagnostics;assembly=WindowsBase"
        Value="{Binding trace:PresentationTraceSources.TraceLevel=High,
            ElementName=txtValue, Path=Text, Mode=OneWay,
            UpdateSourceTrigger=PropertyChanged}"
        Minimum="0" Maximum="500"></Slider>

5
为什么会分离?如果像移动绑定控件上的拇指这样的操作导致失活或断开绑定,那么它有点违背了单向绑定的目的。所谓“破坏”,是指预期的行为不再出现。 - Gishu
这就是它的实现方式 :-( 如果不符合您的需求,请不要使用WPF数据绑定。 - Alex Janzik

0

如果您创建一个继承自Slider的控件,然后重写Value属性,并在更改值时使用DependencyObject.SetCurrentValue而不是DependencyOpbject.SetValue,那么当以编程方式更改值时,您的数据绑定将被保留。

很抱歉这并不特别详尽,我会在以后更新此答案,包括基本实现。

或者,一个包含文本框和滑块的UserControl将成为一个非常可重用的实现,在其中您可以将它们都绑定到相同的自定义依赖属性,使绑定单向,劫持滑块的值更改事件,设置e.Handled = true,并从中调用SetCurrentValue函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接