簡體   English   中英

DependencyProperty可以綁定兩次到TwoWay綁定嗎?

[英]Can a DependencyProperty bound two times to a TwoWay binding?

我有一個顯示某些內容的控件(我們稱其為Display )。 在此控件中,我有一個Camera類,用於存儲縮放,位置和旋轉之類的內容。

我可以從外部控件更改縮放ZoomBar (我們將其ZoomBar )。

現在,我有了將它們都通過TwoWay-Binding連接的想法,如下所示:

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

它應該像: ZoomBar值更改->更新Display.Zoom >更新Camera.Zoom Display.Zoom並沒有真正做任何事情。 僅用於在CameraZoomBar之間交換數據。

但是我什么也沒得到。 短暫檢查一下相機后:

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

我得到了大量的MessageBoxes。 我猜那里有些循環。 ZoomBar.Value > Display.Zoom > ZoomBar.Value > ...


我的問題

雙向綁定是否會引起問題,如果是綁定,是否有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();

  ...
}

您當然可以將一個屬性值綁定到多個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>

這不會像您的代碼中那樣導致任何反饋循環,因此我懷疑您還有其他事情要做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM