【问题标题】:ReSharper Custom Conversion - AutoProperty to MvxPropertyReSharper 自定义转换 - AutoProperty 到 MvxProperty
【发布时间】:2014-04-26 00:49:09
【问题描述】:

在我们的架构中,我们有很多这样的模型

public class UserModel
{
    public string FirstName {get;set;}
}

由于我们使用 MvvmCross 作为我们的视图模型,我们需要我们的属性看起来像这样

public class UserViewModel: MvxViewModel
{
    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; RaisePropertyChanged(() => FirstName); }
    }
}

现在我已经有了一个 R# 模板,只需输入 propmvx 就可以编写我自己的 mvx 属性,但我仍然需要输入类型和名称。

我想知道是否有办法设置自定义转换模板,以便让 alt + enter 上下文菜单有第二个选项...喜欢

  • [T]o 具有支持字段的属性
  • 到带有支持字段的 [M]vx 属性

【问题讨论】:

    标签: mvvmcross automated-refactoring resharper-7.1


    【解决方案1】:

    即使不创建任何自定义插件或模式,使用ReSharper Annotations 也是可能的。我最近用 JetBrains 录制了一个网络研讨会,准确地演示了如何使用注释来解决这个问题。可以here观看。

    简答:方法

    public void RaisePropertyChanged<T>(Expression<Func<T>> property)
    

    MvxNotifyPropertyChange.cs 中的一个需要用NotifyPropertyChangedInvocatorAttribute 进行注释,然后您可以简单地在属性上按 Alt-Enter,并将其更改为 Property with change notification

    现在,由于您不能(或不想)修改 MvvmCross 的源代码,您可以通过 XML 在外部应用这些注释。查看位于 ReSharper 安装目录中的 ExternalAnnotations 目录。它包含一堆用于其他 MVVM 框架的外部注释。这是一种简单的 XMLDoc 格式,因此您可以为 MvvmCross 创建一个 XML 并在其中编写适当的方法。之后,将文件保存在 MvvmCross 目录下(或者无论如何调用程序集),重新加载您的解决方案,它应该就可以工作了!

    欲了解更多信息,请观看我的网络研讨会(以上链接),或JetBrains help

    这是一个适用于该方法的外部注释文件。

    Cirrious.MvvmCross.ExternalAnnotations.xml

    <?xml version="1.0" encoding="utf-8"?>
    <assembly name="Cirrious.MvvmCross">
    
      <member name="M:Cirrious.MvvmCross.ViewModels.MvxNotifyPropertyChanged.RaisePropertyChanged``1(System.Linq.Expressions.Expression{System.Func{``0}})">
        <attribute ctor="M:JetBrains.Annotations.NotifyPropertyChangedInvocatorAttribute.#ctor" />
      </member>
    
    </assembly>
    

    它正在发挥作用:

    【讨论】:

    • 我不建议将 xml 文件保存在产品目录中。该目录不会出现在 8.2 中(注释现在被打包为扩展)。将 xml 文件与 mvvmcross dll 并排保存,或将其打包为自己的扩展 - confluence.jetbrains.com/display/NETCOM/1.06+Packaging+%28R8%29
    • 是的,@citizenmatt 是对的!但我不想在这里指定它,因为它被标记为“ReSharper-7.1”,所以......
    • @citizenmatt 我正在使用 R#7.1,但我们很快就会升级。我现在所做的是创建一个 ViewModelBase 扩展 MvxViewModel 从那里我 new RaisePropertychanged 并相应地注释它。
    • 后续问题,是否可以更改模板?我在注释文件中看到了NotifyPropertyChangedInvocator,但我不确定它使用的是什么模板……我只是想重新格式化一下。
    • 无法更改生成的代码 - 它不使用模板,而是动态生成。这是由于引发更改通知的方式有很多——字符串、lambda、ref 参数等。这对于模板来说太疯狂了。
    猜你喜欢
    • 2013-05-05
    • 1970-01-01
    • 2014-10-14
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    相关资源
    最近更新 更多