2011-01-27 89 views
1

問題 我創建了一串橢圓,我希望它們的填充筆刷不透明度根據滑塊值進行更改。我將滑塊綁定到一個屬性,並通過轉換器將橢圓的FillProperty綁定到相同的屬性。當我更新滑塊時,橢圓不會改變。但是,當我重新創建它們時,它們會發生變化。WPF雙重約束

我覺得Ellipse綁定沒有看到我通過其他綁定進行的更改,因此不會更新。我不知道要設置什麼標誌使其將級聯我正在對屬性進行的更改,或者是否需要將屬性包裝在某種花哨的對象中。

希望有任何幫助。

技術細節 我有一個類:聲明一(公共,自動)稱爲BubbleOpacity財產(窗口)。在某個時候,我創建一個滑塊並將其綁定(雙向)到我的屬性。

var slider = new Slider { Width = 150, Minimum = 0, Maximum = 1, Value = 0.2 }; 
slider.SetBinding(RangeBase.ValueProperty, new Binding("BubbleOpacity") { Source = this, Mode = BindingMode.TwoWay 

到目前爲止好。然後我創建了幾個省略號。其中一個橢圓可能看起來像這樣:

var ellipse = new Ellipse {*}我設置了Width,Height,Margin,Stroke ...等等 }; (新的SolidColorBrush(Colors.LightGoldenrodYellow))});

BrushOpacityConverter類僅根據傳遞的不透明度值創建新畫筆。它看起來像這樣,如果你必須知道。

class BrushOpacityConverter : IValueConverter 
{ 
    private readonly Brush _brush; 

    public BrushOpacityConverter(Brush brush) 
    { 
     _brush = brush; 
    } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var brushclone = _brush.CloneCurrentValue(); 
     brushclone.Opacity = (double) value; 
     return brushclone; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return null; 
    } 

如果我在Convert方法上設置了斷點,我發現當我更新滑塊時它不會被調用。它在我重新創建橢圓時確實會被調用(正確)。

回答

3

問題是,當您更改BubbleOpacity屬性時,您不會通知任何人您已更改它。

要修復此問題,您可以實施INotifyPropertyChanged界面,並在BubbleOpacity屬性更改時引發PropertyChanged事件。

另一種選擇是將BubbleOpacity財產申報作爲一個依賴屬性,像這樣:

public double BubbleOpacity { 
    get { return (double)GetValue(BubbleOpacityProperty); } 
    set { SetValue(BubbleOpacityProperty, value); } 
} 

public static readonly DependencyProperty BubbleOpacityProperty = 
    DependencyProperty.Register("BubbleOpacity", typeof(double), typeof(Window), new UIPropertyMetadata(1d)); 

我寧願第二個選項(因爲這個屬性的DependencyObject內聲明的)。

+0

非常感謝,作品廣告。如果想要用google找到這些東西,這將會花費很多時間,所以再次感謝您輸入解決方案。 =) – Gleno 2011-01-27 16:45:37