2010-12-03 40 views
8

我希望能夠在XAML中使用任意C#表達式。通常這將基於兩個綁定值來計算UI元素的屬性。是否存在一種在XAML中使用任意C#表達式的方法?

例如,基於兩個其他屬性計算UI元素的寬度。

這是想我的XAML看起來像一個人爲的例子:

<TextBox 
    x:Name="textBox1" 
    /> 

<TextBox 
    x:Name="textBox2" 
    /> 

<Rectangle 
    Height={Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text)} 
    /> 

當然有在XAML這樣做的沒有內置的方式。

我知道我可以使用MultiBinding結合自定義轉換器,這通常是我做這種事情的方式。然而,在我看來,僅僅在XAML中包含一些C#代碼會非常簡單,我想知道是否有人用XAML擴展或其他方法解決了這個問題。

+2

有人維護你的工作。 – 2010-12-03 14:01:20

+0

如果XAML編譯器實際上支持這個,那麼維護這些XAML文件會容易得多!這是因爲你不必去創造大量的轉換器類來完成這項工作,而更少的類意味着更少的維護。 – 2010-12-03 14:06:26

+1

是的,這可能是這樣,但是這破壞了將演示文稿與業務邏輯分開的對象,這意味着更多的維護。而且,由於使用不規範,造成混亂。 – 2010-12-03 14:08:53

回答

2

您嵌入C#代碼爲XAML這樣的:

<x:Code> 
      <![CDATA[ 

      void ButtonOnClick(object sender, RoutedEventArgs args) 
      { 
       Button btn = sender as Button; 
       MessageBox.Show("The button labeled '" + 
           btn.Content + 
           "' has been clicked.","Information Message"); 
      } 
      ]]> 
    </x:Code> 

但不建議在所有的,因爲它融合了業務邏輯純表示層這種做法。

2

我見過使用IronPython代碼並調用DLR的自定義Xaml轉換器。它不完全是C#,但它確實比使用[CDATA]標籤的方法更難看。

http://pybinding.codeplex.com/

這是鏈接對此事的一個開源項目。

1

請記住,使用像

Height={Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text)} 

代碼這是特別困難(雖然不是完全不可能,保持LINQ表達式記),以獲得儘快的一些操作數的變化重新評估值。源更改時自動更新目標值是WPF綁定的主要優點之一。

1

將您的表達式包裝到公共屬性中並綁定到該屬性。

在C#代碼隱藏:

public double Heigth 
{ 
    get { return Double.Parse(textBox1.Text) + Double.Parse(textBox2.Text); } 
} 

在XAML:

<Rectangle Height={Binding Heigth} /> 
0

我現在有一個回答我的問題。這不是我最初尋找的答案,它有點長,但確實奏效。

我正在閱讀這個帖子喬希史密斯。他建議不要使用值轉換器,但推計算下來到視圖模型和揭露它作爲一個屬性:

http://groups.google.com/group/wpf-disciples/browse_thread/thread/3fe270cd107f184f?pli=1

在我來說,我都「textBox1的」和「TextBox2中」文本應裝訂成視圖模型,所以當它們在視圖模型中改變時,我知道它有時間進行計算並更新相關屬性。依賴屬性然後觸發其屬性更改事件和UI更新。

如果你有,你想使表達依賴於只讀控件屬性,你不能輕易地綁定到視圖模型的情況下,你可以照做這裏介紹:

Pushing read-only GUI properties back into ViewModel

我仍然希望能夠在XAML中嵌入(非業務邏輯)表達式。但是看到這樣做並不是以任何方式進行的,這很可能有些破綻。瀏覽視圖模型似乎是這樣做的正確方法,但也許有一天我會嘗試編寫允許在XAML中表達的標記擴展。

相關問題