可以将依赖属性绑定两次到双向绑定吗?

时间:2014-09-18 13:16:17

标签: c# wpf xaml binding

我有一个显示某些内容的控件(让我们称之为Display)。在这个控件中,我有一个类Camera,它存储缩放,位置和旋转等内容。

我可以从外部控件更改缩放(让我们称之为ZoomBar)。

现在我有想法将所有这些连接到像这样的TwoWay-Binding:

ZoomBar.Value <--> Display.Zoom <--> Camera.Zoom

应该是:ZoomBar值更改 - &gt;更新Display.Zoom - &gt;更新Camera.ZoomDisplay.Zoom并没有真正做点什么。它仅用于交换CameraZoomBar之间的数据。

但我一无所获。在相机中进行短暂检查后:

public float Zoom
{
  get { MessageBox.Show("Any calls here?"); return (float)GetValue(ZoomProperty); }
  set { ... }
}

我收到了大量的MessageBoxes。我想那里有类似循环的东西。像ZoomBar.Value - &gt; Display.Zoom - &gt; ZoomBar.Value - &gt; ...


我的问题

双向绑定是否导致问题,如果是绑定,是否有XAML方法来解决此问题?


XAML ZoomBar

<StatusBarItem Title="Zoom Bar" HorizontalAlignment="Right">
  <Slider x:Name="uxInputZoom" Style="{DynamicResource ZoomSliderStyle}" Value="100" Maximum="500" Minimum="20" />
</StatusBarItem>

XAML显示

<Display x:Name="uxDisplay" Zoom="{Binding Value, Converter={StaticResource PercentToFractionConverter}, ElementName=uxInputZoom, Mode=TwoWay}" />

代码显示

public static readonly DependencyProperty ZoomProperty = DependencyProperty.Register("Zoom", typeof(float), typeof(Display), new FrameworkPropertyMetadata(1f));

public float Zoom
{
  get { return (float)GetValue(ZoomProperty); }
  set { SetValue(ZoomProperty, value); }
}

Camera _camera = new Camera();

//...

public Display()
{
  Binding binding = new Binding("Zoom");
  binding.Source = _camera;
  binding.Mode = BindingMode.TwoWay;

  BindingOperations.SetBinding(this, Display.ZoomProperty, binding);

  InitializeComponent();

  ...
}

1 个答案:

答案 0 :(得分:1)

您当然可以将一个属性值绑定到多个UI控件。举一个这个简单的例子,它允许移动Slider来更新TextBox中的值,同时还允许在TextBox中输入的值来更新Slider.Value属性:

<StackPanel>
    <Slider Value="{Binding Width2}" Minimum="0.0" Maximum="100.0" Margin="0,0,0,20" />
    <TextBox Text="{Binding Width2, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>

这不会导致代码中出现任何反馈循环,所以我怀疑你还有别的东西在做。