2012-06-29 44 views
12

我可以有以下幾種(ActualWidth除以2)嗎?數學運算符可以應用於綁定路徑嗎?

<StackPanel Name="SP2" Width="{Binding ElementName=SP1, Path=ActualWidth/2}"> 

似乎不適合我。

謝謝。

+0

你想做什麼?將「寬度」設置爲「SP1.ActualWidth」值的一半?如果是這樣,一個'轉換器'可能是你所追求的。 –

+0

請不要在綁定中使用'ActualWidth',因爲它不是一個依賴項屬性,並不一定符合您的期望。見問題http://stackoverflow.com/questions/7403151(WPF)和http://stackoverflow.com/questions/1602148(Silverlight)。 –

+0

@PhilipKendall,是的,那正是我想要做的。每次窗口大小調整時,我都希望SP2能達到SP1的一半寬度。 –

回答

19

您可以使用自定義轉換器直接在XAML中執行簡單的計算。

看看,例如,在此實現:

MathConverter

簡單的用法:

<RotateTransform Angle="{Binding Text, ElementName=Seconds, 
    Converter={ikriv:MathConverter}, ConverterParameter=x*6}" /> 

最經典的方法是創建一個只讀屬性來計算。 因此,在這種簡單情況下,您可以添加第二個屬性HalfWidth

public double HalfWidth 
{ 
    get 
    { 
     return ActualWidth/2.0; 
    } 
} 

壞消息是,當ActualWidth更新,在視圖上StackPanel勢必HalfWidth將不會更新。 這是因爲視圖不知道HalfWidth已更改。

通過在設置者ActualWidth上提高屬性更改事件HalfWidth,該視圖將查詢HalfWidth並因此檢索正確的值。

private double _actualWidth; 
public double ActualWidth 
{ 
    get 
    { 
     return _actualWidth; 
    } 
    set 
    { 
     if (_actualWidth != value) 
     { 
      _actualWidth = value; 
      OnPropertyChanged("ActualWidth"); 
      OnPropertyChanged("HalfWidth"); 
     } 
    } 
} 

這種方法的主要proplem是,它很快會成爲一場噩夢,當我們有沒有制定者衆多的計算性能。

這就是爲什麼(在MVVM模式中)我個人更喜歡使用自定義轉換器。

+0

謝謝。如何決定是完成所有這些工作還是隻在Windows的SizeChanged事件處理程序中有一行代碼背後? –

+0

@老吉澤爾我已經更新了我的答案 –

2

不,您只能在綁定中使用屬性(以及某些情況下的索引到數組/集合中)。

取而代之,您需要綁定到返回預期值(例如ActualWidth/2)的notify屬性,或者使用在應用計算時返回值的轉換器。

相關問題