C# DependencyProperty可以绑定两次到双向绑定吗?
我有一个显示某些内容的控件(我们称之为C# DependencyProperty可以绑定两次到双向绑定吗?,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我有一个显示某些内容的控件(我们称之为Display)。在这个控件中,我有一个类Camera,它存储缩放、位置和旋转等内容 我可以从外部控件更改缩放(我们称之为ZoomBar) 现在我有了这样一个想法,用一个双向绑定将它们连接起来: ZoomBar.Value <--> Display.Zoom <--> Camera.Zoom 我收到了大量的信息箱。我猜里面有点像回路。像ZoomBar.Value-->Display.Zoom-->ZoomBar.Value-->
Display
)。在这个控件中,我有一个类Camera
,它存储缩放、位置和旋转等内容
我可以从外部控件更改缩放(我们称之为ZoomBar
)
现在我有了这样一个想法,用一个双向绑定将它们连接起来:
ZoomBar.Value <--> Display.Zoom <--> Camera.Zoom
我收到了大量的信息箱。我猜里面有点像回路。像ZoomBar.Value
-->Display.Zoom
-->ZoomBar.Value
-->
我的问题 是双向绑定导致了问题吗?如果是绑定,是否有XAML方法解决此问题
XAML ZoomBar
您当然可以将一个属性值绑定到多个UI控件。以这个简单的示例为例,它允许移动
滑块
来更新文本框
中的值,同时也允许在文本框
中输入的值来更新滑块。值
属性:
<StackPanel>
<Slider Value="{Binding Width2}" Minimum="0.0" Maximum="100.0" Margin="0,0,0,20" />
<TextBox Text="{Binding Width2, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
这不会像您的代码中那样导致任何反馈循环,因此我怀疑您还有其他人在这样做。确实,它可以根据需要进行绑定,为此显示一些xaml。绑定基础结构不使用CLR属性包装器;它使用DependencyObject/Property API直接更新值。如果这些值只是通过绑定引擎更新的,那么您应该根本看不到任何消息框。我忘了注释掉一些代码。你是对的,还有别的事。非常感谢。
<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();
...
}
<StackPanel>
<Slider Value="{Binding Width2}" Minimum="0.0" Maximum="100.0" Margin="0,0,0,20" />
<TextBox Text="{Binding Width2, UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>