2

我在启动时启用了双向绑定的滑块。但是当我移动它们时,移动并不顺畅。因此,我决定在调用 Thumbs.DragStarted 事件后将绑定模式从双向更改为单向源,但这会导致立即将值从 1 更改为 0。

我的问题是:如何防止滑块在新绑定期间更改其值?

我的代码如下。

    private void SliderCameraZ_OnDragStarted(object sender, DragStartedEventArgs e)
    {
        try
        {
            BindingExpression bindingExpression = ((Slider) sender).GetBindingExpression(Slider.ValueProperty);
            BindingOperations.ClearBinding((Slider) sender, Slider.ValueProperty);
            Binding binding = new Binding();
            binding.Path = bindingExpression.ParentBinding.Path;
            binding.Mode = BindingMode.OneWayToSource;
            binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            ((Slider)sender).SetBinding(Slider.ValueProperty, binding);

        }
        catch (Exception exception)
        {
            MessageBox.Show(exception.Message + exception.StackTrace + exception.TargetSite);
        }
    }
4

2 回答 2

1

Delay在大多数情况下,使用 .Net 4.5 中引入的属性应该足以减少更新调用花费的时间。有关示例,请参阅为绑定更新添加延迟以减少噪音

<StackPanel>
    <Slider x:Name="ValueSlider"
            Minimum="0" Maximum="100"
            Margin="20" Height="25"
            Value="{Binding ElementName=ValueText, Delay=500, Path=Text, Mode=TwoWay}" />
    <TextBox x:Name="ValueText" Text="50"
             Width="100" Height="50" FontSize="20"
             HorizontalAlignment="Center" /> 
</StackPanel>

如果您确实需要立即更新,您仍然可以分别调用BindingExpression.UpdateSource 方法BindingExpression.UpdateTarget 方法

BindingExpression bindingExpression = ValueSlider.GetBindingExpression(Slider.ValueProperty);
bindingExpression.UpdateSource();

但是您的问题是关于在更改绑定模式后防止值更改。我注意到这只出现在BindingMode.OneWayToSource. 也许您可以通过将上面的示例更改为

<StackPanel>
    <Slider x:Name="ValueSlider"
            Minimum="0" Maximum="100"
            Margin="20" Height="25"
            Value="50" />
    <TextBox x:Name="ValueText"
             Text="{Binding ElementName=ValueSlider, Path=Value, Mode=TwoWay}"
             Width="100" Height="50" FontSize="20"
             HorizontalAlignment="Center" /> 
</StackPanel>

现在TextBox是必然的,Slider而不是相反。BindingMode.OneWayToSource将是BindingMode.OneWay并且绑定更改不应导致值更改。

BindingExpression bindingExpression = ValueText.GetBindingExpression(TextBox.TextProperty);
Binding binding = new Binding();
binding.Source = bindingExpression.DataItem;
binding.Path = bindingExpression.ParentBinding.Path;
binding.Mode = BindingMode.OneWay;
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
ValueText.SetBinding(TextBox.TextProperty, binding);
于 2013-09-03T10:29:39.460 回答
0

一切都很简单。我只需要存储滑块的值并在设置新绑定后恢复它。

于 2013-09-04T12:49:29.333 回答