序言:我正在为公司需求制作测井工具。我们通过Caliburn在我们的项目中使用MVVM模式。此时,我的工具能够通过Mono.Cecil程序集编织编译代码,并在公共属性集方法中注入日志记录方法的调用。
Fabula:让我们说,我有一个班级Person
public class Person
{
public string Name
{
get { return _name; }
set
{
Logger.MyLogMethod(_name, value, "Person");
_name = value;
}
}
private string _name;
}
和一个班级Logger
public static class Logger
{
public static void MyLogMethod(string oldvalue, string newvalue, string propertyname)
{
//condition to log only user changes
}
}
一个人的实例将其Name属性绑定到文本框
<TextBox Text="{Binding SelectedPerson.Name}"/>
我们有一个按钮,点击调用代码,将新值设置为SelectedPerson。
因此,我们有两种方法在运行时设置Person的Name属性。它可以是用户输入文本框,也可以是用户点击按钮,因此可以调用一些代码。
我想知道:如何区分这两种情况。换句话说 - 当调用属性的set方法时 - 如何通过绑定引擎或我们的代码来调用它。
到目前为止,我有一种方法在我看来是可行的 - 看看StackTrace。不知道如何做到这一点。
答案 0 :(得分:0)
您可以将Name属性设为私有。然后公开一个公共属性进行绑定,另一个公开属性用于应用程序的其余部分。 您可以知道区分呼叫与来自其他地方的呼叫的绑定
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}"/>