【问题标题】:Notification when values within collection change集合中的值更改时的通知
【发布时间】:2013-02-20 13:13:24
【问题描述】:

我正在为 C# 中的 Windows 8 商店应用程序开发自定义控制器。 我添加了一些 DependencyProperties;一些简单的(比如下面的Radius)和一组用于构造和绘制各种形状的自定义项(NinjaSource)。

<StackPanel>
    <cc:NinjaControl Margin="120,0,0,0" NinjaSource="{Binding NinjaCollection}" Radius="45"/>
</StackPanel>

集合看起来像这样

public ObservableCollection<Ninja> NinjaCollection{ get; set; }

而且Ninja类基本都有一些属性,实现了INotifyPropertyChanged

public class Ninja : INotifyPropertyChanged
    {
        private string _name;
        private double _value;
        private Path _path;
        private bool _showName;

        public string Name
        {
            get { return _name; }
            set
            {
                if (value == _name) return;
                _name = value;
                OnPropertyChanged();
            }
        }

        ...

每当一个简单的属性(如Radius)发生更改时,我的自定义控件都会将其拾取并重新绘制,如下所示:

public sealed partial class NinjaControl: UserControl
{
        public static readonly DependencyProperty RadiusProperty =
            DependencyProperty.Register("Radius", typeof (double), typeof (NinjaControl),
                                        new PropertyMetadata(default(double), PropertyChangedCallback));

        ...

        private static void PropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            var instance = o as NinjaControl;

            if (instance == null) return;
            instance.RedrawMyControl();
        }

这很好用,我可以将 Radius 绑定到我想要的任何东西,并且每当它发生变化时都会调用 PropertyChangedCallback

我希望每当 NinjaCollection 内部的任何值发生变化时都会发生同样的事情。

我为实际集合注册了一个 DependencyProperty,带有一个属性包装器,但我相信它只会查看实际集合的更改,而不是其中的值。

    public static readonly DependencyProperty NinjaSourceProperty = 
DependencyProperty.Register("NinjaSource", typeof(ObservableCollection<Ninja>), typeof(NinjaControl), new PropertyMetadata(new ObservableCollection<Ninja>(), PropertyChangedCallback));

任何帮助表示赞赏。

【问题讨论】:

  • 请贴出你的控件的xaml(使用NinjaSource时的部分),问题可能出在那儿
  • 我的控件没有任何 XAML,除了来自空画布。控件完全由代码构造

标签: c# xaml windows-8 observablecollection inotifypropertychanged


【解决方案1】:

您想要做的不是将 ObservableCollection 公开为 NinjaSource。创建一个包含可观察集合的自定义对象。公开特定的 Add Remove 方法,这些方法将允许您随后引发事件。

【讨论】:

  • 我遇到的问题不在于添加和删除集合中的项目,而是更新集合对象中的属性。 ObservableCollection 是自定义对象的一部分,我将其用作使用控件的页面的数据源。
  • 如果项目更新,你想提高集合修改吗?你只需要引发相应的proprtychanged事件
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-02-03
  • 2018-11-06
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多