使用INotifyPropertyChanged的代码片段

我找到了INotifyPropertyChanged的这段代码片段

但是它显示了这样的代码:

INotifyPropertyChanged的

我会这样的:

  1. 公众:第一个字母的大写字母+ …

  2. 私人:第一个字母+下划线+小写字母+ …

我怎样才能做到这一点?

编辑:无需键入公共和私有字段

   type Property type string   property Property name MyProperty   notifyMethod name of method to raise PropertyChanged event NotifyPropertyChanged       

我不认为这可以通过Visual Studio提供的本机代码片段function来完成。

我个人使用Resharper,这使它成为可能。 它可以转换我写的代码

 public string Name { get; set; } 

 private string _name; public string Name { get { return _name; } set { if(value == _name) return; _name = value; OnPropertyChanged("Name"); } } 

它甚至为您生成OnPropertyChanged()方法。

片段可以用xml编写,可以用于vs中的任何语言

   
Notify Property Changed Method Akash npcm This method implements the OnPropertyChanged method and binds to the event handler SurroundsWith Expansion

这是自动生成notify属性更改方法的代码。 您需要做的就是将其保存在单个文件中,扩展名为您的Documents / VisulaStudio(YourVersion)/ Code Snippets / Visual C#/中的片段

这就是你准备好使用它……

现在,请观察代码片段中有快捷方式标记..此标记引用了在写入时应该在vs中使用的标记以激活代码段。

这是属性本身的代码:

   
Notifiable Property Akash nprop Property With in Built Property Changed method implementation. SurroundsWith Expansion
Type string Property PlaceHolder

在这个特定的片段中你需要做的就是键入nprop并按tab tab它会生成所需的代码..你只需要输入数据类型和名称..其余部分由片段本身处理…

虽然这是一个更好的解决方案并且大大提高了编码速度,但这适用于小型项目,只有viewmodelbase方法适用于大型项目。

不幸的是,使用代码片段是不可能的。

您需要的是必须转换$property$或其他文字。 即使您将属性名称拆分为2个部分(第一个字母和其余部分),您也必须使字母大写(或者反之 – 小写)。

片段仅提供非常有限的转换函数 – 对于C#而言只有3个,并且其中没有一个可以提供所需的结果。 请参阅MSDN上的代码段function 。 对于截至2013年的所有Visual Studio版本都是如此。

我会给你一个你不想听到的答案:你根本不应该这样做。 您的模型应具有(完整或自动)属性,然后您的ViewModel属性应该只有一个getter和一个返回_model.MyProperty的setter。

此外,您可能需要查看CallerMemberName以摆脱那个讨厌的魔术字符串。 如果你想要我,我会发一些例子。


例如,我有一个DealsUser模型类(注意内部逻辑如何生成电子邮件地址,如果它从未明确设置,在这里完成):

 public class DealsUser : IDealsUser { public DealsUser() : this("GUEST") { } public DealsUser(string username) { this.Username = username; this.IsAdministrator = false; this.IsPlanModerator = false; this.IsPlanner = false; } public string Username { get; set; } public bool IsAdministrator { get; set; } public bool IsPlanModerator { get; set; } public bool IsPlanner { get; set; } private string _emailAddress; public string EmailAddress { get { return _emailAddress ?? string.Format( "{0}@mycompany.co.za", this.Username); } set { _emailAddress = value; } } public override string ToString() { return this.Username; } 

我有一个带有以下事件和受保护方法的BaseViewModel类(请注意我们如何使用CallerMemberName来消除魔术字符串):

 #region INotifyPropertyChanged Members public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { var eventHandler = this.PropertyChanged; if (eventHandler != null) { eventHandler(this, new PropertyChangedEventArgs(propertyName)); } } protected bool SetProperty(ref T storage, T value, [CallerMemberName] string propertyName = null) { if (object.Equals(storage, value)) { return false; } storage = value; this.OnPropertyChanged(propertyName); return true; } protected bool SetModelProperty(T storage, T value, Action setter, [CallerMemberName] string propertyName = null) { if (object.Equals(storage, value)) { return false; } setter(); this.OnPropertyChanged(propertyName); return true; } #endregion 

然后我从BaseViewModelinheritance,我依赖将模型注入到我的构造函数中,并尝试尽可能地保持我的ViewModel。 请注意,我必须使用SetModelProperty而不是SetProperty ,因为您不能将属性(例如_dealsUser.Username )作为引用变量传递给lamba函数。 另请注意, IsPlannerIsPlanModerator包含额外的逻辑,可在更改时更新相关的通知属性:

 public class DealsUserVM : BaseViewModel { private readonly IDealsUser _dealsUser; public DealsUserVM() : this(new DealsUser()) { // Empty ctor } public DealsUserVM(IDealsUser dealsUser) { _dealsUser = dealsUser; } public IDealsUser Model { get { return _dealsUser; } } public string Username { get { return _dealsUser.Username; } set { SetModelProperty(_dealsUser.Username, value, () => { _dealsUser.Username = value; }); } } public bool IsAdministrator { get { return _dealsUser.IsAdministrator; } set { SetModelProperty(_dealsUser.IsAdministrator, value, () => { _dealsUser.IsAdministrator = value; }); } } public bool IsPlanModerator { get { return _dealsUser.IsPlanModerator; } set { // If IsPlanModerator has changed (and was updated as a result) if (SetModelProperty(_dealsUser.IsPlanModerator, value, () => { _dealsUser.IsPlanModerator = value; })) { // If IsPlanModerator is now TRUE if (value) { this.IsPlanner = true; } } } } public bool IsPlanner { get { return _dealsUser.IsPlanner; } set { // If IsPlanner has changed (and was updated as a result) if (SetModelProperty(_dealsUser.IsPlanner, value, () => { _dealsUser.IsPlanner = value; })) { // If IsPlanner is now FALSE if (!value) { this.IsPlanModerator = false; } } } } public string EmailAddress { get { return _dealsUser.EmailAddress; } set { SetModelProperty(_dealsUser.EmailAddress, value, () => { _dealsUser.EmailAddress = value; }); } } public override string ToString() { return _dealsUser.ToString(); } } 

希望这可以帮助 :-)

令我惊讶的是,还没有提出以下建议。 我拿了你的初始片段(来自原作者的页面)并进行了以下修改。 您应该能够将其复制并粘贴到您自己的代码段文件中。

    
propn propn Code snippet for property and backing field in class implementing INotifyPropertyChanged Brian Schroer, Modified by RLH Expansion
type Property Type int variable Underlying Variable _myProperty property Property name MyProperty notifyMethod name of method to raise PropertyChanged event NotifyPropertyChanged

什么改变了

首先,我添加了一个新的文字variable 。 这将创建一个新的可更新项目,您可以在该代码段中对其进行制表。 变量名默认为_propertyName ,如您所见,它是一个小写名称。 请注意,与原始代码段不同,下划线在PropertyName文字之前进行了硬编码。 在我的代码中,我从属性名称中分离出变量名称。

我选择不在我的代码段中对下划线进行硬编码,这样如果其他人使用此代码,他们可以自由选择不同风格的变量名称。 但是,默认情况下,我暗示使用下划线。

如果要强制使用下划线,请将默认variable值更改为propertyName 。 然后,引用任何variable ,将_字符放在引用之前。