2010-11-15 63 views
1

當我重繪面板時,我正在對valueconverter中的數據進行一些重新縮放。我想將這些處理中的一部分移到視圖模型中,因爲大部分處理僅在控件大小或其他一些屬性發生更改時纔會發生。WPF:在代碼中綁定到只讀屬性

爲確保重新縮放的數據看起來可以接受,我需要在視圖模型中容器的ActualWidth。我想將它綁定到viewmodel的一個屬性,所以當它發生改變時,我可以觸發重新縮放處理。

所有我能找到的例子都會將CLR或依賴屬性綁定到一個元素上,而不是另一種方式,而且我明顯錯過了我的理解中的一些東西來解決我該怎麼做。我已經嘗試了幾個不同的設置綁定的東西,但我沒有把它做對。

任何提示?謝謝。

在MyView的XAML:

<myItemsControl/> 

在MyView的代碼背後,是這樣的:

Binding b = new Binding(MyWidthProperty); 
b.Mode = BindingMode.OneWay; 
b.Source = myItemsControl.Name; 
.........? 

public static readonly DependencyProperty MyWidthProperty = 
DependencyProperty.Register("MyWidth", typeof(Double), typeof(MyViewModel)); 

在MyViewModel:

public Double MyWidth{ 
     get { return _myWidth; } 
     set { _myWidth = value; ViewChanged(this); } } 
+0

我會讀一點有關的DependencyProperty。尤其是,您的對象必須是DependencyObject,並且您必須使用GetValue和SetValue方法來訪問基礎值。最後,當綁定系統訪問DP時(這點很容易忽略),你不會得到setter調用,所以你需要傳遞一個Changed處理函數作爲註冊調用的一部分。 – 2010-11-15 17:19:28

回答

2

你不能這樣做。您不能將Binding設置爲ActualWidth,因爲它是隻讀的。

您只能設置綁定到MyWidth。但爲此,您需要首先將MyWidth轉換爲DependencyProperty。然後,你就可以做這樣的事情

Binding b = new Binding("ActualWidth") { Source = myItemsControl }; 
this.SetBinding(MyViewModel.MyWidthProperty, b); 

對於轉換成一個依賴屬性,你需要用下面的取代的MyWidth你的定義:

public static readonly DependencyProperty MyWidthProperty = 
    DependencyProperty.Register("MyWidth", typeof(double), typeof(MyViewModel), 
             new UIPropertyMetadata(
              0.0, 
              (d, e) => 
              { 
               var self = (MyViewModel)d; 
               ViewChanged(self); 
              })); 

但要小心依賴屬性;最好先閱讀文檔。

編輯:您還需要定義屬性是這樣的:

public double MyWidth 
{ 
    get { return (double)this.GetValue(MyWidthProperty); } 
    set { this.SetValue(MyWidthProperty, value); } 
} 
+0

感謝您的非常完整的答案。由於討厭的語法,我避免了依賴屬性,而我在WPF的其他部分取得了進展。我第一次被迫使用一個...看起來像我最好能在他們之上,因爲我預計它會再次發生。 – rjw 2010-11-16 19:12:47