2013-02-28 23 views
0

創建DependancyProperty收集與可綁定的項目,我需要建立一個DependancyProperty收集 並以某種方式結合或能知道每個項目改變如何在WPF

這是不容易解釋這個問題..

要聲明一個簡單DependancyProperty我們這樣做:

public static readonly DependencyProperty SelectedColorProperty = 
     DependencyProperty.Register("SelectedColor", typeof(Color), 
    typeof(MyClass), new PropertyMetadata(Colors.Red)); 

public Color SelectedColor 
{ 
get { return (Color)GetValue(SelectedColorProperty); } 
set { SetValue(SelectedColorProperty, value); } 
} 

,後來在XAML,我們可以這樣做:

<MyClass SelectedColor="{Binding blah blah}"/> 

如果我添加在靜態聲明價值變動一個簡單的回調所以不是
只是new PropertyMetadata(Colors.Red)
我得:new PropertyMetaData(Colors.Red,MyCallback)
每次值改變,我將能夠從該變化作出反應後面的代碼。

好了,現在我想要的東西,將被寫入XAML這樣的:

<MyClass> 
    <MyClass.SelectedColors> 
    <Color>{Binding blah1}</Color> 
    <Color>{Binding blah2}</Color> 
    <Color>{Binding blahN}</Color> 
    <MyClass.SelectedColors> 
</MyClass> 

但是,我不能用multibinding,因爲我想知道哪些顏色已經改變 和multibinding給我一個聚合策略,當 我寫完了multibinding轉換器,我會得到所有的值從所有的「無聊症」 在同一時間,將無法知道哪一個 是改變了一個意思..

我開始寫一些簡單的東西那看起來如下:

public static readonly DependencyProperty SelectedColorsProperty = 
      DependencyProperty.Register("SelectedColors", typeof(List<Color>), 
     typeof(MyClass), 
      new PropertyMetadata(new List<Color>())); 

    public List<Color> SelectedColors 
     { 
      get { return (List<Color>)GetValue(SelectedColorsProperty); } 
      set { SetValue(SelectedColorsProperty, value); } 
     } 

    public MyClass() 
     { 
      foreach(var item in SelectedColors) 
      { 
     //dunno what goes here.. or how to bind the color change? 
      } 
     } 

所以現在我不能創建一個回調,將處理每個項目的每個更改,對不對? 然而,這正是我需要的,是能對變化作出反應,每個項目..

但是它允許我表達的XAML語法,我需要..

任何想法?有沒有人遇到過這種問題? 我發現很簡短說明在MSDN,但我不知道這是否可以幫助我,如何 使用它,如果能有所幫助,這是在提到 一些有關使用

Freezable<T> 

頁最後一段http://msdn.microsoft.com/en-us/library/aa970563.aspx

謝謝你的幫助, 謝謝。


更新:一個MultiBinding解決方案也可以是確定的,如果它將使區分其值發生了變化(在我們的例子中的顏色變化)。
標記在這種情況下,可能看起來像:

<MyClass> 
    <MyClass.SelectedColors> 
     <MultiBinding.. 
     <Binding Path="FillColor" ElementName="MyRectWhichHasFillColorDProperty"/> 
     <Binding blah2 which is Color2 /> 
     <Binding blah3 which is ColorN /> 
+0

你嘗試過使用ObserableCollection嗎? – makc 2013-02-28 07:57:15

+0

嗯爲什麼?我不需要知道什麼時候項目被添加或刪除,或從集合中被取代或清除 - 我需要知道的是當項目自己被更改時,例如「顏色紅色」更改爲「綠色」。 – 2013-02-28 14:46:23

+0

我覺得不會出現這種多重綁定。首先是 – 2013-02-28 14:46:59

回答

0

總結你的顏色在實現INotifyPropertyChanged,然後設置一個監聽器PropertyChanged事件對你的構造每種顏色的類。

包裝類

public class ColorViewModel : INotifyPropertyChanged 
{ 
    private Color color; 
    public Color Color 
    { 
     get { return color; } 
     set 
     { 
      if (value != color) 
      { 
       color = value; 
       NotifyPropertyChanged("Color"); 
      } 
     } 
    } 

    // INotifyPropertyChanged implementation goes here 
} 

然後在你的事件監聽器,你會得到激發的屬性更改事件的個人ColorViewModel。

我必須解決一個非常類似的問題,我創建了我的ViewModel類的ObservableCollection,以便我可以訂閱集合更改,並將我的事件偵聽器附加/分離到更改的項目。

我在我的Surface上從內存中輸入了這個,所以可能有很多錯別字,你應該把代碼示例作爲sudo代碼。

希望這會有所幫助。

編輯

這是你的XAML可能看起來是這樣的:

<namespace:MyClass> 
    <namespace:MyClass.SelectedColors> 
     <namespace:ColorViewModel Color="{Binding SomeValue}" /> 
     <namespace:ColorViewModel Color="{Binding OtherValue}" /> 
    </namespace:myClass.SelectedColors> 
</namespace:MyClass> 

其中ColorsColorViewModel的集合。

您將無法在施工中有顏色沒有ColorViewModels時間線了您的PropertyChanged聽衆在你的構造,因爲,我只想讓色彩的ObservableCollection並使用CollectionChanged事件要連接PropertyChanged聽衆任何新的收藏品。

您可能只想使用SolidColorBrush而不是ColorViewModel類,因爲它具有Color屬性和Changed事件。

+0

- 謝謝。但在XAML方面看起來如何呢?請記住,我專門列出了XAML在使用XAML時的樣子。 – 2013-02-28 14:44:15

+0

我添加了一個你的'Xaml'可能看起來像什麼的例子。我想有一點時間它可以更接近。自從我在原始帖子上拍攝時,我已經測試過這個功能,它對我很有用。 – 2013-02-28 16:31:45