根据我的理解,我们可以在 MVVM 风格的应用程序中使用 INofityProperty,代码类似于以下内容
object _SelectedPerson;
public object SelectedPerson
{
get
{
return _SelectedPerson;
}
set
{
if (_SelectedPerson != value)
{
_SelectedPerson = value;
RaisePropertyChanged("SelectedPerson");
}
}
}
现在,我已经看到了约什·史密斯的出色榜样 http://msdn.microsoft.com/en-us/magazine/dd419663.aspx他在其中实现了额外的代码来捕获如果开发人员输入无法识别的属性名称(例如拼写错误)时会发生什么情况!
如果您讨厌这个,请告诉我,但是有一种方法可以从堆栈跟踪中获取方法名称。所以,我们可以改为实现类似的东西
object _SelectedPerson;
public object SelectedPerson
{
get
{
return _SelectedPerson;
}
set
{
if (_SelectedPerson != value)
{
_SelectedPerson = value;
RaisePropertyChanged(Current.Method);
}
}
}
static class Current
{
public static string Method()
{
StackTrace st = new StackTrace();
return (st.GetFrame(1).GetMethod().Name.Split('_')[1]);
}
}
我只能假设这总是有效,因为 RaisePropertyChanged 事件总是发生在 Setter 中(如果我错了,请纠正我)。
现在请注意,我无法真正尝试这个,因为在工作中(我可以从事更大的项目)我仍然使用 .NET 2.0,所以 WPF/MVVM 未来还有很长的路要走但我正在用自己的时间学习。
所以,我的问题来自那些使用过它的人,与删除错误选项相比,有一种警告用户错误的方法真的更好吗?事实是,约什·史密斯是公认的该领域的专家,因此,如果他建议采用这种方法,那么通常我会盲目遵循,但在这种情况下,我忍不住要质疑它并觉得有必要了解更多。
您可以通过抽象基类执行 INotifyPropertyChanged。这可能如下所示:
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Event, fired when the Property has changed
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyExpression">() => this.Param</param>
protected virtual void OnPropertyChanged<T>(Expression<Func<T>> propertyExpression)
{
var propertyName = ExtractPropertyName(propertyExpression);
OnPropertyChanged(propertyName);
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
/// <summary>
/// Extracts the propertyname out of the Expression given
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyExpression"></param>
/// <returns></returns>
private static string ExtractPropertyName<T>(Expression<Func<T>> propertyExpression)
{
var memberExpression = propertyExpression.Body as MemberExpression;
return memberExpression == null ? null : memberExpression.Member.Name;
}
}
在 .Net 4.5 中,您可以创建一个类,如下所示:
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
在那里你只需要打电话
OnPropertyChanged();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)