如何自动化创建WPF视图模型属性

4

我正在使用Visual Studio '17和Resharper在一个显示大量信息给用户的WPF项目中。因此,我有很多属性看起来像下面这样。

private double _foo;
public double Foo
{
   get { return _foo; }
   set { SetProperty(ref _foo, value); }
}

我正在寻找一种快速自动化的方式来创建这个。现在我输入“prop”,就会得到这个结果:

public double Foo {get; set;}

按下 'Alt-Enter' -> '转换为具有后备字段的属性' 即可获得此功能

private double _foo;
public double Foo
{
   get { return _foo; }
   set { _foo = value); }
}

然后手动输入SetProperty(ref和','来获得最终结果。我尝试设置片段和resharper模板,但似乎无法在一次操作中完成。人们想出了什么方法使这更容易?具体而言,如果我能将已经存在的自动属性更改为视图模型属性,那将非常有帮助。


1
那些不是依赖属性,它们是视图模型属性。这里是我使用的代码片段。我也有依赖属性的代码片段。 - 15ee8f99-57ff-4f92-890c-b56153
2
Dep(依赖属性)是使用Resharper的一种属性类型。 - Ayyappan Subramanian
Dep接近了,但我需要进一步澄清我的问题才能真正达到我的目标。已经编辑了问题以反映我所寻找的内容。 - PlTaylor
4个回答

2
你可以定义自己的代码片段,以精确地满足你的需求。
这是我为自己编写的一个代码片段,用于生成与我经常使用的INotifyPropertyChanged基类实现兼容的属性实现:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>INPCProperty</Title>
      <Author>Peter Duniho</Author>
      <Description>Property declaration for NotifyPropertyChangedBase</Description>
      <Shortcut>inpcprop</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>fieldName</ID>
          <Default>_fieldName</Default>
          <ToolTip>Enter actual field name here</ToolTip>
        </Literal>
        <Literal>
          <ID>fieldType</ID>
          <Default>object</Default>
          <ToolTip>Enter actual field value type here</ToolTip>
        </Literal>
      </Declarations>
      <Code Language="CSharp">
        <![CDATA[private $fieldType$ $fieldName$;
        public $fieldType$ FieldName
        {
            get { return $fieldName$; }
            set { _UpdateField(ref $fieldName$, value); }
        }]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

使用Visual Studio代码段管理器将代码段添加到您的安装中。

(我没有添加属性名称本身的字段,因为似乎没有必要。但是,如果您愿意,当然可以添加。我看到的唯一优点是与仅选择属性名称并覆盖它相比,如果它是一个字段,您应该能够在覆盖之前使用Tab键直接进入它。)


0

0

你可以为此创建自己的代码片段。我已经为BindableBase(来自PRISM)属性创建了propbb代码片段,它基本上与你想要的相同。要创建代码片段,请参考我遵循的视频。

https://www.youtube.com/watch?v=tGmXlUFMTpk

我的代码片段看起来像这样

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>propbb</Title>
      <Shortcut>propbb</Shortcut>
      <Description>Code snippet for BindableBase property and backing field</Description>
      <Author></Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type</ID>
          <ToolTip>Property type</ToolTip>
          <Default>int</Default>
        </Literal>
        <Literal>
          <ID>property</ID>
          <ToolTip>Property name</ToolTip>
          <Default>MyProperty</Default>
        </Literal>
        <Literal>
          <ID>field</ID>
          <ToolTip>The variable backing this property</ToolTip>
          <Default>myVar</Default>
        </Literal>
      </Declarations>
      <Code Language="csharp">
        <![CDATA[private $type$ $field$;
                   public $type$ $property$
                  {
                    get { return $field$;}
                      set { SetProperty(ref $field$ , value);}
                  }
    $end$]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

如果你想使用我的代码片段,只需将其包含在你的Visual Studio中(就像我提供的视频中一样)

propbb snippet download

在VS2017中添加代码片段的路径: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC#\Snippets\1033\Visual C# 只需从我的Dropbox下载代码片段并复制到该路径下,然后输入propbb并按Tab键即可使用。


0

通过我的Visual Commander扩展,您可以使用以下C#命令(参考:Microsoft.VisualBasic)来创建视图模型属性:

public class C : VisualCommanderExt.ICommand
{
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package)
    {
        string propertyName = Microsoft.VisualBasic.Interaction.InputBox("Property name", "Create view model property [1/2]", "Foo", -1, -1);
        string propertyType = Microsoft.VisualBasic.Interaction.InputBox("Property type", "Create view model property [2/2]", "double", -1, -1);
        string fieldName = "_" + System.Char.ToLower(propertyName[0]) + propertyName.Substring(1);
        string snippet = @"
private {1} {2};
public {1} {0}
{{
   get {{ return {2}; }}
   set {{ SetProperty(ref {2}, value); }}
}}
";
        EnvDTE.TextSelection ts = DTE.ActiveDocument.Selection as EnvDTE.TextSelection;
        ts.Text = string.Format(snippet, propertyName, propertyType, fieldName);
    }
}

使用C# 6更简单,但需要Visual Commander Professional:

public class C : VisualCommanderExt.ICommand
{
    public void Run(EnvDTE80.DTE2 DTE, Microsoft.VisualStudio.Shell.Package package)
    {
        string propertyName = Microsoft.VisualBasic.Interaction.InputBox("Property name", "Create view model property [1/2]", "Foo", -1, -1);
        string propertyType = Microsoft.VisualBasic.Interaction.InputBox("Property type", "Create view model property [2/2]", "double", -1, -1);
        string fieldName = "_" + System.Char.ToLower(propertyName[0]) + propertyName.Substring(1);

        EnvDTE.TextSelection ts = DTE.ActiveDocument.Selection as EnvDTE.TextSelection;
        ts.Text = $@"
private {propertyType} {fieldName};
public {propertyType} {propertyName}
{{
   get {{ return {fieldName}; }}
   set {{ SetProperty(ref {fieldName}, value); }}
}}
";
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接