首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DependencyObject也实现了INotifyPropertyChanged?

DependencyObject也实现了INotifyPropertyChanged?
EN

Stack Overflow用户
提问于 2014-06-09 17:01:32
回答 1查看 209关注 0票数 0

对于Silverlight和WPF应用程序,我有一个自定义控件,其中包含一个ObservableCollection作为依赖项属性。该控件的一个元素,边框,需要根据ObservableCollection中项的组合来更改颜色。

例如,假设收集的是动物、蔬菜和矿物质,称为ObjectList。如果至少有一种动物,我希望边界是红色的;如果没有动物,但至少有一种蔬菜,它是绿色的;否则,收集的只有矿物质,所以会出现蓝色。

我创建了一个转换器,它可以接收集合并确定颜色,所以有一个绑定,如:

代码语言:javascript
复制
<Border Background="{Binding ObjectList, 
                     RelativeSource={RelativeSource Self}, 
                     Converter={StaticResource MyColorConverter}}" />

挑战在于,随着项目从ObjectList中添加/删除,我需要触发背景色的重新评估;然而,ObjectList本身并没有改变。我想我有三个选择,但我不确定哪一个可能是最佳做法:

  1. 每次添加或删除对象时创建一个新集合。这似乎很麻烦,但会导致ObjectList被更改,从而触发后台更新。
  2. 为用于UpdateTargetCollectionChanged回调中的背景属性调用ObjectList。由于UpdateTarget不适用于Silverlight,所以我只是删除并重新添加绑定--再次有点麻烦。
  3. 在我的自定义控件上实现INotifyPropertyChanged,并在CollectionChanged实现中在ObjectList上调用CollectionChanged

我最喜欢3,但我有一个DependencyObject也实现了INPC,这似乎很奇怪。是吗?有没有更优雅的方法?

EN

回答 1

Stack Overflow用户

发布于 2014-06-10 09:35:46

这是MSDN文档推荐的一种方法。 (向下滚动到使用VisualStateManager的最佳实践;它是为完整的.Net编写的,但本节也非常适合Silverlight )。每当您的VisualStates依赖于您的自定义Control的属性/状态时,建议为每个VisualState设置一个ChangedHandler --影响属性,并从那里调用一个私有的UpdateVisualStates方法。评估您的条件,并在此方法中以编程方式设置VisualStates

即使您不使用VisualStates进行颜色更改,我也建议您遵循同样的模式。

为了简洁起见,下面的代码不完整:

代码语言:javascript
复制
public ObservableCollection ObjectList {...}
public static readonly DependencyProperty ObjectListProperty =
    DependencyProperty.Register(...OnObjectListChanged...);

private static void OnObjectListChanged(...)
{ObjectList.CollectionChanged += OnObjectListCollectionChanged;}

private void OnObjectListCollectionChanged(...){ UpdateVisualStates(); }

private void UpdateVisualStates()
{
    //actually you have to instatiate a SolidColorBrush here
    if (ContainsAtLeastOneAnimal()) { m_border.Background = Colors.Red; }
    else if (ContainsAtLeastOneVegetable()) {m_border.Background = Colors.Green;}
    else { m_border.Background = Colors.Blue; }
}

如果不希望引用边界,可以随意引入DependencyProperty BorderColor并从xaml绑定到它。这很好。有另一个移动的部分是没有问题的。这比模拟整个ObjectList实例改变要好得多。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24125128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档