我有一个显示某些内容的控件(让我们称之为Display
)。在这个控件中,我有一个类Camera
,它存储缩放,位置和旋转等内容。
我可以从外部控件更改缩放(让我们称之为ZoomBar
)。
现在我有想法将所有这些连接到像这样的TwoWay-Binding:
ZoomBar.Value <--> Display.Zoom <--> Camera.Zoom
应该是:ZoomBar
值更改 - &gt;更新Display.Zoom
- &gt;更新Camera.Zoom
。 Display.Zoom
并没有真正做点什么。它仅用于交换Camera
和ZoomBar
之间的数据。
但我一无所获。在相机中进行短暂检查后:
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方法来解决此问题?
<StatusBarItem Title="Zoom Bar" HorizontalAlignment="Right">
<Slider x:Name="uxInputZoom" Style="{DynamicResource ZoomSliderStyle}" Value="100" Maximum="500" Minimum="20" />
</StatusBarItem>
<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();
...
}
答案 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>
这不会导致代码中出现任何反馈循环,所以我怀疑你还有别的东西在做。