2010-03-31 33 views
9

Mới đối với MVVM vì vậy hãy tha thứ cho sự thiếu hiểu biết của tôi.MVVM - RaisePropertyThay đổi mã chuyển thành một mớ hỗn độn

Tôi nghĩ tôi đang sử dụng nó đúng, nhưng tôi thấy ViewModel của tôi có quá nhiều trong số này:

RaisePropertyChanged("SomeProperty") 

Mỗi lần tôi thiết lập một tài sản tôi phải tăng mà tài sản nguyền rủa thay đổi.

Tôi nhớ những ngày mà tôi chỉ có thể đi:

public int SomeInteger { get; private set;} 

Những ngày này tôi phải dính vào những "RaisePropertyChanged" ở khắp mọi nơi hoặc giao diện người dùng của tôi không phản ánh những thay đổi :(

Tôi có làm nó sai hoặc là những người khác nhận được khó chịu với số lượng quá nhiều dây ma thuật và định cư bất động sản cũ?

Tôi có nên sử dụng thuộc tính phụ thuộc thay thế không? (Tôi nghi ngờ điều này sẽ giúp mã bloat)

Mặc dù những vấn đề này tôi vẫn nghĩ MVVM là con đường để đi vì vậy tôi đoán đó là một cái gì đó.

+1

"Tôi nhớ những ngày mà tôi có thể đi" dễ dàng như thế nào chúng ta quên, trong C# 2 bạn không thể làm điều đó cả. ;) – AnthonyWJones

+0

ya tôi đoán tôi đã hư hỏng nhưng mặc dù tiến độ được thực hiện, tôi vẫn nghĩ rằng có thể có một cách sạch hơn để thực hiện công cụ này. Tôi không biết các hoạt động bên trong/sự cân bằng đủ mặc dù ... – vidalsasoon

Trả lời

12

Hãy xem What is the best or most interesting use of Extension Methods you've seen? này.

Nó mô tả một phương pháp mở rộng và một phương thức trợ giúp mà các lớp Model và ViewModel của tôi sử dụng để cho phép các thuộc tính được đánh máy mạnh mẽ (không có chuỗi ký tự).

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set { this.NotifySetProperty(ref _name, value,() => this.Name); } 
} 

Điều này đơn giản như tôi nghĩ rằng nó có thể nhận được. Hy vọng nó giúp.

+0

Cảm ơn. vui mừng khi biết tôi không phải là người duy nhất gặp vấn đề. – vidalsasoon

4

Nó giúp xem xét mọi thứ từ một quan điểm khác: những thuộc tính này không phức tạp. Thuộc tính .NET, nhưng thuộc tính phụ thuộc đơn giản.

Thuộc tính có thể ràng buộc của mô hình chế độ xem trong WPF không giống với thuộc tính .NET, thay vào đó là một loại kho khóa-giá trị. Nếu bạn muốn thay thế trọng lượng nhẹ cho DependencyObject, bạn có khả năng thực hiện kho khóa-giá trị này chỉ cần mua gọi hàm nhất định trong setters - không phải là xấu, thực sự. Ngoài lý tưởng, tất nhiên, nhưng quan điểm của bạn chắc chắn là không công bằng.

8

Bạn có thể sử dụng thuộc tính NotifyPropertyChanged của PostSharp. Sau đó, tất cả những gì bạn phải làm là đặt một thuộc tính lên lớp và đó là nó. Ví dụ:

[NotifyPropertyChanged] 
public class MyClass 
{ 
    public string MyProperty { get; set; } 
} 
+0

thú vị! tò mò về chi phí mặc dù ... – vidalsasoon

+3

Không có chi phí thời gian chạy vì PostSharp chỉ đơn giản là sửa đổi lớp được biên dịch và tiêm chính xác cùng mã mà bạn viết theo cách thủ công. Có một thời gian xây dựng nhỏ trên đầu nhưng tôi thấy nó không đáng kể. –

+0

Hạn chế duy nhất của phương pháp này là đôi khi cần thiết để RaisePropertyChanged cho một thuộc tính khác với thuộc tính mà trình setter đang được gọi. – Random

0

Nó không đưa bạn trở lại mã sạch, nhưng tôi sử dụng một phương pháp mở rộng đơn giản để lấy tên thuộc tính để tránh các vấn đề với chuỗi ma thuật. Nó cũng duy trì khả năng đọc mã, nghĩa là nó rõ ràng những gì đang xảy ra.

Phương pháp mở rộng chỉ đơn giản là như sau:

public static string GetPropertyName(this MethodBase methodBase) 
{ 
    return methodBase.Name.Substring(4); 
} 

Với điều này có nghĩa là bạn bộ tài sản đang kiên cường chống lại sự thay đổi tên và trông giống như sau:

private string _name; 
public string Name 
{ 
    get { return _name; } 
    set 
    { 
      name = value; 
      RaisePropertyChanged(MethodBase.GetCurrentMethod().GetPropertyName()); 
    } 
} 

Tôi đã viết nhiều về điều này extension method here và tôi đã published a matching code snippet here.

+0

Câu hỏi cũ, tôi biết :) Một cách khác là gói gọn RaisePropertyChanged bên trong một lớp cơ sở và sử dụng chữ ký phương thức sau: OnRaisePropertyChanged ([CallerMemberName] propertyName = ""). Bằng cách này bạn có thể gọi phương thức mà không cần phải viết tên thuộc tính –

0

Điều này sẽ giúp: "Kind Of Magic" Effortless INotifyPropertyChanged

[http://visualstudiogallery.msdn.microsoft.com/d5cd6aa1-57a5-4aaa-a2be-969c6db7f88a][1]

là một ví dụ cho việc thêm đến một thuộc tính:

[Magic] 
public string Name { get { return _name; } set { _name = value; } } 
string _name; 

một ví dụ khác cho thêm nó vào tất cả các thuộc tính của lớp:

[Magic] 
public class MyViewModel: INotifyPropertyChanged 
{ 
    public string Name { get; set; } 
    public string LastName { get; set; } 
    ..... 
} 
Các vấn đề liên quan