2011-06-20 37 views
5

Tôi đã tìm kiếm xung quanh nhưng tôi dường như không thể tìm thấy những gì tôi đang tìm kiếm, vì vậy tôi sẽ đưa nó vào đây.C# WPF Làm thế nào để đặt phương thức setter bất động sản?

Tình huống: Tôi có lớp MainWindow và MainWindowData. Trong MainWindowData chỉ là các thuộc tính công khai được định nghĩa với thuộc tính UpdateGUI.

public class UpdateGUI : Attribute { } 

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

Bây giờ tôi muốn thêm phương thức vào phương thức setter của mỗi thuộc tính trong MainWindowData. cụ thể hơn:

void OnPropertyChanged(String PropertyName); 

tôi figured tôi muốn lấy toàn bộ tài sản UpdateGUI trong constructor MainWindow, và sau đó bằng cách nào đó thêm một phương pháp khác với nó, nhưng đây là nơi tôi bị mắc kẹt. tôi sử dụng mã này để lấy tất cả tài sản, trong đó hoạt động:

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

này mang lại cho tôi một danh sách tốt đẹp của tất cả tài sản mà tôi phải cập nhật.

Vì vậy, câu hỏi là: làm thế nào tôi có thể làm cho nó để các thuộc tính tự động được chuyển đổi từ:

tới:

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

Cảm ơn bạn đã giúp đỡ nào! Nó sẽ được đánh giá cao :)

Greetings

+0

+1 Câu hỏi thú vị, sẽ rất thú vị nếu thấy điều gì xảy ra. –

Trả lời

5

gì bạn đang tìm kiếm đã được giải quyết trong các khái niệm về Aspect Oriented Programming (AOP).

Một ví dụ là in PostSharp, (Ngoài ra, see details here) cho phép bạn ghi dữ liệu/classes viewmodel của bạn như thế này:

[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; } 
} 

Nếu bạn không thích PostSharp, tôi chắc chắn rằng AOP khác khuôn khổ ra có chức năng tương tự.

EDIT

Tôi chỉ tìm thấy NotifyPropertyWeaver mà thực hiện điều này cho bạn mà không đòi hỏi một khuôn khổ AOP đầy đủ.

Nó sử dụng công cụ Mono.Cecil để chèn mã thông báo trong quá trình biên dịch và có thể cài đặt thông qua NuGet (đây là những gì tôi đã làm) hoặc từ trang web của dự án.

Theo mặc định, nó thậm chí không yêu cầu các thuộc tính, (nó tự động số liệu ra các thuộc tính và các lớp học cần thay đổi thông báo) nhưng bạn có thể rõ ràng cũng như vậy:

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

Một tính năng thú vị tôi tìm thấy trong đó là khả năng khai báo sự phụ thuộc giữa các thuộc tính. Trong trường hợp này, RaisePropertyChanged("FoobarTimesTwo") sẽ được gọi bất cứ khi nào FooBar thay đổi.

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

+1 phần thú vị của công việc. các liên kết đến các chi tiết cung cấp các ý tưởng mã hóa nếu bạn muốn làm điều này. –

+0

Cảm ơn bạn đã trả lời nhanh chóng, đó là chính xác những gì tôi cần. Đáng buồn là nó không phải là miễn phí để sử dụng, nhưng có lẽ tôi có thể tìm ra hoặc tìm thấy một số khung AOP khác. – FrieK

1

Ngoài khuôn khổ AOP như PostSharp cũng có những thứ như:

Mono.Cecil

Với công cụ mà bạn có thể mất một lắp ráp, sửa đổi nó là mã và lưu nó lại

Có một số bài viết của LinFu về AOP có thể giúp

LinFu Articles on CodeProject

0

Khung nguồn mở ImpromptuInterface.MVVM sử dụng các tính năng động C# 4.0 để thêm thuộc tính tự động hỗ trợ thay đổi thuộc tính. ImpromptuViewModel hoạt động giống như ExpandoObject nhưng cũng có các tính năng khác để trợ giúp với MVVM.

Các vấn đề liên quan