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。不知道該怎麼做。
謝謝你的建議,但我不認爲這種做法是合適的,因爲它的地方,從呼叫結合區分通話涉及改變所有綁定或改變所有視圖模型,並且我的同事不會爲此感到高興。我也許可以用MCIL做到這一點,但我相信它會很困難 – netaholic
如果這種方法不適合,那就去看一下http://stackoverflow.com/questions/19737351/determining-the-caller-inside -a-設定器或 - 設置 - 屬性 - 默默地 – AlexH