[英]How to create a DependancyProperty Collection with bindable Items in WPF
我需要創建一個DependancyProperty集合,並以某種方式綁定或能夠知道每個項目何時更改
解釋這個問題並不容易。
要聲明一個簡單的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>
但是,我不能使用多重綁定,因為我想知道哪種顏色發生了變化,多重綁定為我提供了一種聚合策略,這意味着當我完成編寫多重綁定轉換器時,我將同時從所有“ blah”中獲取所有值,並且不知道是哪一個改變了..
我開始寫一些簡單的內容,如下所示:
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 Solution可以區分哪個值發生了更改(在我們的示例中,哪個顏色發生了更改),那么它也可以。
在這種情況下,標記可能如下所示:
<MyClass>
<MyClass.SelectedColors>
<MultiBinding..
<Binding Path="FillColor" ElementName="MyRectWhichHasFillColorDProperty"/>
<Binding blah2 which is Color2 />
<Binding blah3 which is ColorN />
將Colors包裝在實現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>
其中Colors
是ColorViewModel
的集合。
您將無法在構造函數中連接PropertyChanged
偵聽器,因為在構造時Colors中沒有ColorViewModels,因此我只能將Colors設為ObservableCollection
並使用CollectionChanged
事件將PropertyChanged
偵聽器連接到任何新添加的對象。集合。
您可能只想使用SolidColorBrush而不是ColorViewModel類,因為它具有Color
屬性和Changed
事件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.