簡體   English   中英

如何在WPF中使用可綁定項創建DependancyProperty集合

[英]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>

其中ColorsColorViewModel的集合。

您將無法在構造函數中連接PropertyChanged偵聽器,因為在構造時Colors中沒有ColorViewModels,因此我只能將Colors設為ObservableCollection並使用CollectionChanged事件將PropertyChanged偵聽器連接到任何新添加的對象。集合。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM