0

DependancyProperty Collection を作成し、何らかの方法でバインドするか、各項目がいつ変更されるかを知る必要があります

この問題を説明するのは簡単ではありません..

単純な 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 />
4

1 に答える 1

0

INotifyPropertyChanged を実装するクラスで Colors をラップし、コンストラクターで各色の 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使用してリスナーをコレクションへの新しい追加に接続します。CollectionChangedPropertyChanged

ColorプロパティとChangedイベントがあるため、ColorViewModel クラスの代わりに SolidColorBrush を使用することもできます。

于 2013-02-28T05:28:55.447 に答える