English 中文(简体)
WPF 过度财产 变化的活动
原标题:WPF excessive PropertyChanged events

典型的情况是,我们可能想要提出财产抵押物,例如,

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void Notify(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

    public string UserNote
    {
        get { return _userNote; }
        set
        {
            _userNote = value;
            Notify("UserNote"); 
        }
    }

在我们现有的法典基础中,我看到一些情况,即财产抵押品被送去无效,以表明该物体的所有特性均已改变。 这似乎效率低下,似乎导致引发的事件比需要多得多。 这似乎还造成问题,即物体以循环方式相互更新。

这种做法是否好?

守则中的一项评论试图为之辩解......

//The purpose of this method is to wire up clients of NotificationBase that are also
//NotificationBases to *their* clients. Consider the following classes:     
         public class ClassA : NotificationBase
         {
             public int Foo
             {
                 get { return 123; }
                 set { Notify("Foo"); }
             }
         }

         public class ClassB : NotificationBase
         {
             ClassA A = new ClassA();
             public ClassB()
             {
                 A.PropertyChanged += AllChanged;
             }
             public void SetFoo()
             {
                 A.Foo = 456;
             }
         }

         public class ClassC
         {
             ClassB B = new ClassB();
             public ClassC()
             {
                 B.PropertyChanged += delegate { dosomething(); };
                 B.SetFoo(); // causes "dosomething" above to be called
             }
         }

        /// ClassB.SetFoo calls ClassA.Foo s setter, which calls ClassA.Notify("Foo").
        /// The event registration in ClassB s ctor causes ClassB.AllChanged to be called, which calls
        /// ClassB.Notify(null) - implying that ALL of ClassB s properties have changed.
        /// The event registration in ClassC s ctor causes the "dosomething" delegate to be called.
        /// So a Notify in ClassA is routed to ClassC via ClassB s PropertyChanged event.

        protected void AllChanged(Object sender, PropertyChangedEventArgs e)
        {
            Notify(null);
        }

任何想法都受到高度赞赏。

Regards, Fzzy

最佳回答

这实际上与<代码>的设计(或其文件)有关。 PropertyChangedEventArgs。 订立<条码>PropertyName ,使之无效,是指“该物体上的所有财产均已改变”。 但是,除非这几类人被封住,否则你会重新思考,否则你实际上会知道,该物体上的all性质已经改变。 可以说,物体基类别的所有财产都发生了变化。

在我的书中,这足以不使用这一特定公约,但我制造执行财产变更通知的密封类别的案件数目极少。

作为一个实际问题,你真心要做的是,仅仅举出一例会,告诉听众,“该物体上的全部财产已经改变,但我不会让双方逐一告诉你们他们。 当你说:

我看到的是,有人将财产抵押品送去无效,以表明该物品的所有性质都已改变。 这似乎效率低下,似乎导致引发的事件比需要多得多。

......实际意图恰恰相反。 如果方法改变<代码> Foo,Bar,Baz, 和Bat, 物体仅具有4或5种特性, 引起1项事件可能胜于4项。 另一方面,如果该物体拥有60种财产,则每增加4个活动,就很可能使每一个目标听众——甚至那些对这4种财产置之不理的人——在他们所关心的改变财产时,做些什么,因为这些财产确实如此。

问题是,设计的财产变更通知制度没有为每一项工作提供足够微薄的工具。 它设计为完全通用的,对所建立的特定应用领域没有了解。

我认为,这似乎是你设计的缺失之处:应用领域知识。

在你的第二个例子中,如果<代码>Fixturebject有(say)10种特性,取决于<代码>FixtureStatus的价值,则10种财产变更事件的出现似乎有些过分。 或许是这样。 也许物体应生成<代码>FixtureStatusChanged活动。 然后,了解你的应用领域的课程可以听听听一次会,忽视<代码>。 PropertyChanged activity. (你仍在提出关于其他财产的<代码>PropertyChanged活动,以便don t的物体了解。) 活动手段可以保持现状,也就是说,如果您的班级仍有必要实施<条码>指定财产证书/代码>。 页: 1

次要评论: C#宇宙的大多数班级如果采用一种提高<代码”的方法 Foo activity, calls that means OnFoo. 这是一项重要的公约:它明确了这一方法与活动之间的关系,并且使得要求采用这种方法的守则很容易认识到。 http://www.un.org/? 什么? 如果没有你指定公约掩盖其发生的事实,财产变更通知就足够了。

问题回答

仅凭其他内容,我就说<编号>Notify(null)是一种坏的做法。 从本质上讲,这并不是什么意思,如果一位在5年之后的法典制定者认为,除非在评论中出现,否则这很可能意味着什么。

我曾遇到这样的情况,即当其他一些财产通过集水器设定时,在计算财产(无固定装置)方面,需要发射财产确认书。

页: 1

double Number { get { return num;} set { num=value; OnPropertyChanged("Number"); OnPropertyChanged("TwiceNumber"); } }

double TwiceNumber { get {return _num * 2.0;} }

作为一项规则,我只处理获得财产的问题,我看不出为什么在这种情况下发出更改通知的财产是坏的。 但我想,如果我对任何其他案件采取行动,我很可能不知道我正在做什么!





相关问题
WPF convert 2d mouse click into 3d space

I have several geometry meshes in my Viewport3D, these have bounds of (w:1800, h:500, d:25). When a user clicks in the middle of the mesh, I want the Point3D of (900, 500, 25)... How can I achieve ...

Editing a xaml icons or images

Is it possible to edit a xaml icons or images in the expression design or using other tools? Is it possible to import a xaml images (that e.g you have exported) in the expression designer for editing?...

WPF: writing smoke tests using ViewModels

I am considering to write smoke tests for our WPF application. The question that I am faced is: should we use UI automation( or some other technology that creates a UI script), or is it good enough to ...

WPF - MVVM - NHibernate Validation

Im facing a bit of an issue when trying to validate a decimal property on domain object which is bound to a textbox on the view through the viewmodel. I am using NHibernate to decorate my property on ...

How do WPF Markup Extensions raise compile errors?

Certain markup extensions raise compile errors. For example StaticExtension (x:Static) raises a compile error if the referenced class cannot be found. Anyone know the mechanism for this? Is it baked ...

WPF design-time context menu

I am trying to create a custom wpf control, I m wondering how I can add some design-time features. I ve googled and can t seem to get to my goal. So here s my simple question, how can I add an entry ...

How to combine DataTrigger and EventTrigger?

NOTE I have asked the related question (with an accepted answer): How to combine DataTrigger and Trigger? I think I need to combine an EventTrigger and a DataTrigger to achieve what I m after: when ...

热门标签