确定 属性 值是否由用户设置(即绑定)

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}"/>