2015-09-25 63 views
2

序言:我正在爲我們公司的需要製作一個測井工具。我們通過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 
     } 
    } 

而一個人的實例,已經將其名稱屬性綁定到文本框

<TextBox Text="{Binding SelectedPerson.Name}"/> 

和w e有一個按鈕,該按鈕會調用一個代碼,這會將新值設置爲SelectedPerson。

因此,我們有兩種在運行時設置Person's Name屬性的方法。它可以通過用戶在文本框中輸入,也可以通過用戶單擊按鈕來調用某些代碼。

我想知道:如何區分這兩種情況。換句話說 - 當一個屬性的set方法被調用時 - 如何確定它是否被綁定引擎或代碼調用。

到目前爲止,我有一種方法在我看來是可行的 - 看看StackTrace。不知道該怎麼做。

回答

0

您可以將Name屬性設置爲private。然後你暴露一個公共屬性的綁定和另一個應用程序的其餘部分。 可以知道從其他

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

謝謝你的建議,但我不認爲這種做法是合適的,因爲它的地方,從呼叫結合區分通話涉及改變所有綁定或改變所有視圖模型,並且我的同事不會爲此感到高興。我也許可以用MCIL做到這一點,但我相信它會很困難 – netaholic

+0

如果這種方法不適合,那就去看一下http://stackoverflow.com/questions/19737351/determining-the-caller-inside -a-設定器或 - 設置 - 屬性 - 默默地 – AlexH