代码之家  ›  专栏  ›  技术社区  ›  HCL

InotifyPropertiesChanged和Auto属性

  •  46
  • HCL  · 技术社区  · 14 年前

    有使用方法吗 INotifyPropertyChanged 有自动属性吗?可能是某种属性或其他什么,对我来说不明显。

    public string Demo{
        get;set;
    }
    

    对我来说,汽车属性将是一件非常实用的事情,但几乎总是,我必须提高 PropertyChanged -事件如果属性值已更改,并且没有执行此操作的机制,则自动属性对我来说是无用的。

    5 回复  |  直到 7 年前
        1
  •  9
  •   Adam Robinson    14 年前

    没有内置的机制可以做到这一点。类似的东西 PostSharp 可能会为你添加这样的东西(或马克·格雷弗尔的) HyperDescriptor ,如果您只想了解此数据绑定)。

        2
  •  11
  •   ChrisF    11 年前

    这是你必须自己编码的东西。你能得到的最接近的是 this implementation 在使用自定义属性和面向方面方法提供此语法的代码项目上:

    [NotifyPropertyChanged] 
    public class AutoWiredSource
    { 
       public double MyProperty { get; set; } 
    }
    

    曾经有人提议在微软上对C规范进行更改,请执行以下操作:

    class Person : INotifyPropertyChanged
    {
        // "notify" is a context keyword, same as "get" and "set"
        public string Name { get; set; notify; }
    }
    

    但是 proposal 现在已关闭。

        3
  •  11
  •   crea7or    8 年前

    在.NET 4.5中 higher it can be made somewhat shorter :

    private int unitsInStock;
    public int UnitsInStock
    {
        get { return unitsInStock; }
        set { SetProperty(ref unitsInStock, value);}
    }
    
        4
  •  2
  •   Matt Greer    14 年前

    INotifyPropertyChanged 而且,依赖性属性确实使属性变得不那么有趣。我找到的最佳解决方案是好的代码片段。比如那些 Silverlight contrib 项目

        5
  •  1
  •   JavaJedi    7 年前

    我尝试了其他方法,首先使用:

    这些方法是有效的,但是我仍然不得不混淆模型中所有属性的访问器方法,或者使用一个在编码时会导致自动完成的 dynamic object。还值得一提的是,WinForms不支持绑定到动态对象,不幸的是。

    解决方案

    最后我遇到了 reactiveui.fody>。这是一种使用FODY和ReactiveUI的简单解决方案。我在我的wpf项目中成功地使用了它。

    它在所需样板代码中编织, raisePropertiesChanges and observablesPropertiesHelper ,at compile time.

    项目相关性

    https://github.com/kswoll/reactiveui.fody

    我用nuget在我的项目中安装了以下包:

    软件包 <package id=“fody”version=“2.0.7”targetframework=“net452”developmentdependency=“true”/>gt; <package id=“reactiveUI”version=“7.4.0”targetframework=“net452”/> <package id=“reactiveUI.fody”version=“2.2.11”targetframework=“net452”/>gt; <package id=“reactiveUI-core”version=“7.4.0”targetframework=“net452”/>gt; <package id=“rx core”version=“2.2.5”targetframework=“net452”/> <package id=“rx interfaces”version=“2.2.5”targetframework=“net452”/> <package id=“rx linq”version=“2.2.5”targetframework=“net452”/> <package id=“rx main”version=“2.2.5”targetframework=“net452”/> <package id=“rx platformservices”version=“2.2.5”targetframework=“net452”/>gt; <package id=“rx xaml”version=“2.2.5”targetframework=“net452”/> <package id=“splat”version=“1.6.0”targetframework=“net452”/> </packages> < /代码>

    FODY设置

    您需要在项目的顶层创建fodyweavers.xml文件,使其看起来像这样:

    <?xml version=“1.0”encoding=“utf-8”?gt;
    纺织工;
    <反应用户界面/>
    </weavers>
    < /代码> 
    
    

    用法

    只需将模型类设置为inherit off,然后添加 [reactive]attribute above any property you want to notify of changes.

    使用reactiveUI; 使用reactiveui.fody.helpers; 命名空间名称.domain.some{ class someClass:反应对象{ [反应] 公共字符串someproperty get;set; } } < /代码>

    作业完成!重新生成项目并检查Visual Studio中的输出窗口。在处理带注释的模型类并插入适当的样板代码时,您应该看到从FODY输出的一些行。应该是这样的:

    更多信息

    可以在这里找到更有用的信息

  • DynamicViewModel
  • 这些方法是有效的,但是我仍然不得不混淆模型中所有属性的访问器方法,或者使用dynamic对象,它在编码时终止自动完成。还值得一提的是,不幸的是,WinForms不支持绑定到动态对象。

    解决方案

    最后我遇到了ReactiveUI.Fody. 这是一种使用FODY和ReactiveUI的简单解决方案。我在我的WPF项目中成功地使用了这个。

    它按照所需的样板代码编制,RaisePropertyChangesObservableAsPropertyHelper,在编译时。

    项目依赖项

    https://github.com/kswoll/ReactiveUI.Fody

    我用nuget在我的项目中安装了以下包:

    <packages>
      <package id="Fody" version="2.0.7" targetFramework="net452" developmentDependency="true" />
      <package id="reactiveui" version="7.4.0" targetFramework="net452" />
      <package id="ReactiveUI.Fody" version="2.2.11" targetFramework="net452" />
      <package id="reactiveui-core" version="7.4.0" targetFramework="net452" />
      <package id="Rx-Core" version="2.2.5" targetFramework="net452" />
      <package id="Rx-Interfaces" version="2.2.5" targetFramework="net452" />
      <package id="Rx-Linq" version="2.2.5" targetFramework="net452" />
      <package id="Rx-Main" version="2.2.5" targetFramework="net452" />
      <package id="Rx-PlatformServices" version="2.2.5" targetFramework="net452" />
      <package id="Rx-XAML" version="2.2.5" targetFramework="net452" />
      <package id="Splat" version="1.6.0" targetFramework="net452" />
    </packages>
    

    FoDY设置

    您需要在项目的顶层创建一个fodyweavers.xml文件,使其看起来像这样:

    <?xml version="1.0" encoding="utf-8" ?>
    <Weavers>
      <ReactiveUI/>
    </Weavers>
    

    用法

    只需将模型类设置为继承关闭ReactiveObject并添加 [Reactive]属性,位于要通知更改的任何属性之上。

    using ReactiveUI;
    using ReactiveUI.Fody.Helpers;
    
    namespace name.domain.some{
        class SomeClass : ReactiveObject {
            [Reactive]
            public string SomeProperty { get; set; }
        }
    }
    

    作业完成!重新生成项目并检查Visual Studio中的输出窗口。在处理带注释的模型类并插入适当的样板代码时,您应该看到从FODY输出的一些行。它应该是这样的:

    enter image description here

    进一步信息

    可以找到更多有用的信息here.