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

时间:2015-09-25 15:09:29

标签: c# wpf mvvm mono.cecil

序言:我正在为公司需求制作测井工具。我们通过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。不知道如何做到这一点。

1 个答案:

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