Reputation: 136613
Here's a little XAML fragment. You will see
<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>
If I remove the Mode=OneWay
set directive, (defaults to two-way) everything works perfectly.
Why is this happening?
Upvotes: 10
Views: 3969
Reputation: 799
If you create a control which inherits from Slider
, then override the Value
property and use DependencyObject.SetCurrentValue
when changing the value rather than DependencyOpbject.SetValue
, then your databindings will be preserved when changing the values programmatically.
Sorry this isn't particularly exhaustive, will update this answer to include a basic implementation of this at a later date.
Alternatively, a UserControl
which contains both the textbox and the slider would make for a very reusable implementation, in which you could bind them both to the same custom dependencyproperty, make the binding oneway, hijack the valuechanged event of the slider, set e.Handled = true
, and call the SetCurrentValue
function from that.
Upvotes: 0
Reputation: 3832
Your data binding is not broken but deactivated (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
Setting the trace level to high will produce this message in the VS output window in case you move the slider:
<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>
Upvotes: 2