确定 属性 值是否由用户设置(即绑定)
Determine if a property value is set by user (i.e. binding)
前言:我正在为我们公司的需要制作一个日志记录工具。我们通过 Caliburn 在我们的项目中使用 MVVM 模式。目前,我的工具能够通过 Mono.Cecil 程序集编织编译代码,并在 public 属性设置方法中注入记录方法的调用。
Fabula: 比方说,我有一个 class Person
public class Person
{
public string Name
{
get { return _name; }
set
{
Logger.MyLogMethod(_name, value, "Person");
_name = value;
}
}
private string _name;
}
和一个classLogger
public static class Logger
{
public static void MyLogMethod(string oldvalue, string newvalue, string propertyname)
{
//condition to log only user changes
}
}
一个人的实例将其名称 属性 绑定到文本框
<TextBox Text="{Binding SelectedPerson.Name}"/>
我们有一个按钮,点击它会调用一个代码,该代码将为 SelectedPerson 设置新值。
因此,我们有两种方法可以在运行时设置我们的人名 属性。它要么是用户在文本框中输入,要么是用户单击按钮,从而调用一些代码。
我想知道:如何区分这两种情况。换句话说 - 当调用 属性 的 set 方法时 - 如何确定它是由绑定引擎调用还是由 我们的 代码调用。
到目前为止,我认为有一种可行的方法 - 查看 StackTrace。不知道该怎么做。
您可以将名称 属性 设为私有。然后您公开一个 public 属性 用于绑定,另一个用于应用程序的其余部分。
您可以知道将调用与绑定从其他地方的调用区分开来
public class Person
{
string NameForOthers
{
get { return Name; }
set
{
Logger.MyLogMethod(_name, value, "Person name set by other place");
Name= value;
}
}
public string NameForBinding
{
get { return Name; }
set
{
Logger.MyLogMethod(_name, value, "Person name set by binding");
Name= value;
}
}
string Name
{
get { return _name; }
set
{
Logger.MyLogMethod(_name, value, "Person");
_name = value;
}
}
private string _name;
}
然后你用它来绑定
<TextBox Text="{Binding SelectedPerson.NameForBinding}"/>
前言:我正在为我们公司的需要制作一个日志记录工具。我们通过 Caliburn 在我们的项目中使用 MVVM 模式。目前,我的工具能够通过 Mono.Cecil 程序集编织编译代码,并在 public 属性设置方法中注入记录方法的调用。
Fabula: 比方说,我有一个 class Person
public class Person
{
public string Name
{
get { return _name; }
set
{
Logger.MyLogMethod(_name, value, "Person");
_name = value;
}
}
private string _name;
}
和一个classLogger
public static class Logger
{
public static void MyLogMethod(string oldvalue, string newvalue, string propertyname)
{
//condition to log only user changes
}
}
一个人的实例将其名称 属性 绑定到文本框
<TextBox Text="{Binding SelectedPerson.Name}"/>
我们有一个按钮,点击它会调用一个代码,该代码将为 SelectedPerson 设置新值。
因此,我们有两种方法可以在运行时设置我们的人名 属性。它要么是用户在文本框中输入,要么是用户单击按钮,从而调用一些代码。
我想知道:如何区分这两种情况。换句话说 - 当调用 属性 的 set 方法时 - 如何确定它是由绑定引擎调用还是由 我们的 代码调用。
到目前为止,我认为有一种可行的方法 - 查看 StackTrace。不知道该怎么做。
您可以将名称 属性 设为私有。然后您公开一个 public 属性 用于绑定,另一个用于应用程序的其余部分。 您可以知道将调用与绑定从其他地方的调用区分开来
public class Person
{
string NameForOthers
{
get { return Name; }
set
{
Logger.MyLogMethod(_name, value, "Person name set by other place");
Name= value;
}
}
public string NameForBinding
{
get { return Name; }
set
{
Logger.MyLogMethod(_name, value, "Person name set by binding");
Name= value;
}
}
string Name
{
get { return _name; }
set
{
Logger.MyLogMethod(_name, value, "Person");
_name = value;
}
}
private string _name;
}
然后你用它来绑定
<TextBox Text="{Binding SelectedPerson.NameForBinding}"/>