【问题标题】:ReSharper warnings with MVVM使用 MVVM 的 ReSharper 警告
【发布时间】:2011-02-16 22:47:33
【问题描述】:

当我使用 WPF 实现 MVVM 模式时,我发现 ReSharper 经常警告我某些属性从未在我的 ViewModel 中使用。问题是它们正在被使用,但仅由数据绑定系统使用。有没有其他人遇到过这种烦恼,有没有办法帮助 ReSharper 意识到这些属性确实被使用了?至少,我很高兴 VS 2010 正确地意识到 [Import] 标记的成员不会“总是为空”,但希望我也能解决这个问题。

【问题讨论】:

    标签: c# wpf mvvm resharper warnings


    【解决方案1】:

    您可以使用外部注释向 ReSharper 指示使用的方法,因此不会警告您。请参阅here 上的 ReSharper 文档。

    您需要使用[UsedImplicitlyAttribute] 装饰任何此类方法。

    在使用属性之前,你会看到:

    然后,在应用属性之后:

    [UsedImplicitly(ImplicitUseTargetFlags.WithMembers)]
    class NotUsed
    {
        public int Field1 { get; set; }
        public int Field2 { get; set; }
    }
    

    【讨论】:

    • 还有一种方法可以将此属性应用于例如接口的所有成员吗?我尝试了 ImplicituseTargetFlags,但没有成功。
    • @Matthias Koch 这适用于我使用ImplicitUseTargetFlags.WithMembers - 请在上面我提供截图的地方查看我的更新答案。
    【解决方案2】:

    使用

    <UserControl
    ...
    xmlns:vm="clr-namespace:YourProject.ViewModels" mc:Ignorable="d"
    d:DataContext="{d:DesignInstance vm:SomeClassViewModel}">
    

    它'坚持'对模型的看法。 在 View 中,您可以看到模型属性,反之亦然 - 应该使用模型属性。

    【讨论】:

    • 当视图模型像许多 MVVM 框架一样通过 x:Name 属性自动绑定到视图时,这无济于事。
    • 这对我来说似乎是最好的解决方案。
    【解决方案3】:

    您可以尝试两种不同的选择。

    • 选项 1:将 ReSharper 检查的严重性降低到“提示”。

    • 选项 2:使用 ReSharper 为生成您知道正在使用的警告的属性提供的“使用注释抑制检查”项。

    就个人而言,我会将严重性降低为“提示”。

    【讨论】:

    • 现在将严重性降低到 Hint 效果很好。看到班级右侧未解决的橙色线条让我很困扰。
    【解决方案4】:

    一个粗略的解决方法是完全禁用警告:

    在 ReSharper > 选项 > 代码检查 > 检查严重性下,将此项目的警告级别设置为“不显示”。

    这显然不理想,但这取决于您对误报的烦恼程度。

    【讨论】:

      【解决方案5】:

      这是因为 XAML 绑定的弱类型特性。

      要使 ReSharper 能够从 XAML 视图解析您使用的 VM 的哪些属性,您需要在标记中为 {Binding}s 引入数据上下文类型注释。有关详细信息,请参阅this blog post 中的“绑定帮助”部分。当 ReSharper 知道数据上下文类型时,您将获得正确的使用分析、导航和重构支持。

      ReSharper 还知道 OneWay/OneWayToSource/TwoWay 绑定模式,并将属性 getters/setters/both 访问器标记为分别使用。

      【讨论】:

        【解决方案6】:

        属性是公共的还是内部的?根据我的经验,ReSharper 不会向公众发出警告(因为它无法判断成员没有在外部使用),但它会警告内部成员,因为它们只能在该程序集中使用(尽管有 InternalsVisibleTo )。

        【讨论】:

        • 它们是公开的,我能够将设置更改为仅针对公共属性的提示。我仍然会看到私有/内部属性的警告,这很好。该警告在解决方案范围分析的上下文中显示为“从不使用自动实现的属性访问器。”
        猜你喜欢
        • 1970-01-01
        • 2015-11-15
        • 1970-01-01
        • 1970-01-01
        • 2012-02-09
        • 1970-01-01
        • 2015-06-24
        • 2011-02-26
        • 2011-12-29
        相关资源
        最近更新 更多