0

我需要创建一个 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>

但是,我不能使用多重绑定,因为我想知道哪种颜色发生了变化,并且多重绑定给了我一个聚合器策略,这意味着当我完成编写多重绑定转换器时,我将同时从所有“blahs”中获取所有值并且将不知道哪一个是改变的..

我开始写一些简单的东西,如下所示:

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 />
4

1 回答 1

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>

Colors的集合在哪里ColorViewModel

您将无法在构造函数中连接您的PropertyChanged侦听器,因为在构建时颜色中没有 ColorViewModel,因此我只需将 Colors 设为一个ObservableCollection并使用该CollectionChanged事件将PropertyChanged侦听器连接到集合中的任何新增内容。

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

于 2013-02-28T05:28:55.447 回答