2011-06-20 24 views
5

Etrafımda arama yapıyorum ama aradığım şeyi bulamıyorum, bu yüzden buraya bir bakalım.C# WPF Özellik ayarlama yöntemi dinamik olarak nasıl ayarlanır?

Durum: MainWindow ve MainWindowData sınıfına sahibim. MainWindowData'da, yalnızca UpdateGUI özniteliğiyle tanımlanan genel özellikler bulunur.

public class UpdateGUI : Attribute { } 

public class MainWindowData 
{ 
    [UpdateGUI] 
    public string TESTVAR { get; set; } 
} 

Artık, MainWindowData'daki her özelliğin ayarlayıcı yöntemine bir yöntem eklemek istiyorum. Daha spesifik: Ben MainWindow yapıcı tüm UpdateGUI özelliklerini getirir ve sonra bir şekilde kendisine başka bir yöntem ekleyin ama takıldım budur düşündüm

void OnPropertyChanged(String PropertyName); 

. Ben çalışan tüm özellikleri getirme için bu kodu kullanın: Bu bana güncellemek için gereken tüm özelliklerin güzel bir listesini verir

List<PropertyInfo> properties = (from pi in typeof(MainWindowData).GetProperties() 
           where pi.GetCustomAttributes(typeof(UpdateGUI), false).Any() 
           select pi).ToList(); 

.

Yani soru şu:

için:

[UpdateGUI] 
private string _TESTVAR; 
public string TESTVAR { 
    get { 
     return _TESTVAR; 
    } 
    set { 
     _TESTVAR = value; 
     OnPropertyChanged("TESTVAR"); 
    } 
} 

herhangi bir yardım için teşekkür ederiz özellikleri dinamik dönüştürdü olsun ki onu nasıl yapabilirsiniz! Bu son derece takdir edilecektir :)

Selamlamaları

Eğer Aspect Oriented Programlama (AOP) kavramında çözülmüştür arıyorsun
+0

1 İlginç bir soru, bu çıkıyor ne görmek güzel olacak. –

cevap

5

. örnek in PostSharp olduğunu

Bir, (Ayrıca, see details here) böyle veri/ViewModel sınıfları yazma olanak sağlayan: Eğer PostSharp beğenmezseniz

[NotifyPropertyChanged] 
public class Shape 
{ 
    public double X { get; set; } 
    public double Y { get; set; } 
} 

public class Rectangle : Shape 
{ 
    public double Width { get; set; } 
    public double Height { get; set; } 
} 

, eminim diğer AOP dışarı çerçeveler benzer işlevleri var.

Sadece tam AOP çerçeve gerektirmeden sizin için yapar NotifyPropertyWeaver bulundu

DÜZENLEME.

Derleme sırasında bildirim kodunu enjekte etmek için Mono.Cecil öğelerini kullanır ve NuGet (bu benim yaptığım şey) veya proje web sitesinden yüklenebilir.

Varsayılan olarak, hatta (otomatik özellikleri ve sınıfları bildirimini değiştirmek gerek hangi rakamlar), özelliklerini gerektirmez ancak bunu gibi, aynı zamanda belirgin olabilir: buldum

[NotifyProperty] 
public int FooBar { get; set; } 

Bir güzel özellik İçinde özellikler arasındaki bağımlılıkları ilan etme imkanı vardı. Bu durumda, FooBar her değiştiğinde RaisePropertyChanged("FoobarTimesTwo") çağrılır.Eğer, bir montaj almak bunun bir şifre değiştirmek ve

geri kurtarabilir araç ile

Mono.Cecil

: PostSharp gibi AOP çerçeveler ek olarak

[DependsOn("FooBar")] 
public int FoobarTimesTwo 
{ 
    get { return FooBar * 2; } 
} 
+0

+1 ilginç eser. detaylara olan bağlantılar, bunu kendisinin yapmak isteyip gerektirmediği konusunda kodlama fikirleri sağlar. –

+0

Hızlı cevap için teşekkürler, tam ihtiyacım olan şey bu. Ne yazık ki kullanmakta özgür değil, ama belki bunu anlayabilir veya başka bir AOP çerçevesi bulabilirim. – FrieK

0

açık kaynak çerçevesinde ImpromptuInterface.MVVM mülkiyet değişti destekleyen otomatik özellikler eklemek için C# 4.0 dinamik özellikler kullanılıyor. Bu ImpromptuViewModel bir ExpandoObject gibi çalışır, ancak MVVM ile yardımcı olacak başka özelliklere de sahiptir.

İlgili konular