我正在玩弄將屬性分配作爲表達樹傳遞給方法的想法。該方法將調用表達式,以便正確分配屬性,然後嗅出剛分配的屬性名稱,以便引發PropertyChanged事件。我的想法是,我希望能夠在我的WPF ViewModels中使用超薄自動屬性,並且仍然觸發PropertyChanged事件。使用ExpressionTree分配屬性
我與ExpressionTrees一個無知的人,所以我希望有人能指出我在正確的方向:
public class ViewModelBase {
public event Action<string> PropertyChanged = delegate { };
public int Value { get; set; }
public void RunAndRaise(MemberAssignment Exp) {
Expression.Invoke(Exp.Expression);
PropertyChanged(Exp.Member.Name);
}
}
的問題是我不知道如何調用它。這個天真的嘗試被拒絕了編譯器,我敢肯定將是顯而易見的任何原因誰可以回答這個問題:
ViewModelBase vm = new ViewModelBase();
vm.RunAndRaise(() => vm.Value = 1);
編輯
謝謝@svick了完美的答案。我移動了一個小東西,並將其變爲擴展方法。下面是與單元測試的完整代碼示例:
[TestClass]
public class UnitTest1 {
[TestMethod]
public void TestMethod1() {
MyViewModel vm = new MyViewModel();
bool ValuePropertyRaised = false;
vm.PropertyChanged += (s, e) => ValuePropertyRaised = e.PropertyName == "Value";
vm.SetValue(v => v.Value, 1);
Assert.AreEqual(1, vm.Value);
Assert.IsTrue(ValuePropertyRaised);
}
}
public class ViewModelBase : INotifyPropertyChanged {
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public void OnPropertyChanged(string propertyName) {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public class MyViewModel : ViewModelBase {
public int Value { get; set; }
}
public static class ViewModelBaseExtension {
public static void SetValue<TViewModel, TProperty>(this TViewModel vm, Expression<Func<TViewModel, TProperty>> exp, TProperty value) where TViewModel : ViewModelBase {
var propertyInfo = (PropertyInfo)((MemberExpression)exp.Body).Member;
propertyInfo.SetValue(vm, value, null);
vm.OnPropertyChanged(propertyInfo.Name);
}
}
+1以獲得更完整的答案。 – Ani 2011-04-25 17:08:56
已經+1了,現在接受 - 謝謝你的偉大答案 – 2011-04-25 17:52:33
btw - 關於你的第二個答案,避免像這樣龐大的代碼是我試圖避免擺在首位。我接受了你的答案,並將它變成了一個擴展方法,它應該讓我設置aotu-properties並讓propertyChanged事件自動產生。再次感謝。 – 2011-04-25 17:58:33