我需要创建一个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>
但是,我不能使用多重绑定,因为我想知道哪种颜色 改变和多重绑定给了我一个聚合策略,意思是什么时候 我写了多重绑定转换器,我将得到所有的值 来自所有&#34; blahs&#34;在同一时间,将无法知道哪个 一个是改变的..
我开始写一些简单的东西,如下所示:
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 :(得分: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
侦听器,因为在构造时Color中没有ColorViewModel,因此我只需将Colors设为ObservableCollection
并使用{ {1}}事件将CollectionChanged
个侦听器连接到集合的任何新增内容。
您可能只想使用SolidColorBrush而不是ColorViewModel类,因为它具有PropertyChanged
属性和Color
事件。