Trong MVVM, ViewModel hoặc Model có triển khai INotifyPropertyChanged không?


165

Hầu hết các ví dụ MVVM mà tôi đã làm việc đã thực hiện Mô hìnhINotifyPropertyChanged , nhưng trong ví dụ CommandSink của Josh Smith, ViewModel thực hiệnINotifyPropertyChanged .

Tôi vẫn nhận thức được các khái niệm MVVM, vì vậy tôi không biết nếu:

  • Bạn phải đặt INotifyPropertyChangedViewModel CommandSinkđể hoạt động
  • Đây chỉ là một sai lệch của tiêu chuẩn và nó không thực sự quan trọng
  • Bạn phải luôn luôn triển khai Mô hình INotifyPropertyChangedvà đây chỉ là một lỗi sẽ được sửa nếu điều này được phát triển từ một ví dụ mã cho một ứng dụng

Kinh nghiệm của người khác về các dự án MVVM mà bạn đã làm việc là gì?


4
nếu bạn thực hiện INPC, hãy thử github.com/Fody/PropertyChanged - nó sẽ giúp bạn tiết kiệm hàng tuần để gõ.
CAD bloke

Câu trả lời:


104

Tôi nói hoàn toàn ngược lại, tôi luôn đặt INotifyPropertyChangedViewModel của mình - bạn thực sự không muốn làm ô nhiễm mô hình của mình với một tính năng khá cụ thể của WPF như INotifyPropertyChanged, thứ đó nên có trong ViewModel.

Tôi chắc rằng những người khác sẽ không đồng ý, nhưng đó là cách tôi làm việc.


84
Bạn làm gì nếu một thuộc tính thay đổi trong mô hình? Bạn cần phải đưa nó vào mô hình xem bằng cách nào đó. Câu hỏi trung thực, tôi đang xử lý câu hỏi hóc búa này ngay bây giờ.
Roger Lipscombe

4
EventAggregator trong mã Prism là một thay thế tốt cho INotifyPropertyChanged trên mô hình, với loại sự kiện thay đổi thuộc tính tùy chỉnh. Mã sự kiện trong dự án đó hỗ trợ chuyển tiếp các sự kiện giữa các luồng nền và giao diện người dùng, đôi khi có thể là một vấn đề.
Steve Mitcham

51
INotifyProperyChanged không phải là WPF cụ thể, nó sống trong không gian tên System.ComponentModel, tôi đã sử dụng nó trong các ứng dụng WinForms, cũng INotifyPropertyChanged đã được trong Net kể từ 2.0, WPF đã chỉ được khoảng từ 3,0
benPearce

40
Tôi là một fan hâm mộ của việc đưa INotifyPropertyChanged vào cả MODEL và VIEWMODEL. Tôi không thể nghĩ ra một lý do để không làm điều này. Đây là một cách thông minh để thông báo cho VIEWMODEL về những thay đổi nền đã xảy ra trong MODE của bạn có ảnh hưởng đến VIEWMODEL giống như được sử dụng để thông báo cho VIEW và đã có những thay đổi đối với VIEWMODEL.
ScottCher

6
@Steve - về việc thông báo cho ViewModel rằng thuộc tính của Model đã thay đổi, có vẻ như INotifyPropertyChanged hoạt động tốt như "một sự kiện mà viewmodel có thể tham gia". Tại sao không sử dụng nó?
skybluecodefef

146

Tôi hoàn toàn không đồng ý với khái niệm rằng Mô hình không nên thực hiện INotifyPropertyChanged. Giao diện này không phải là UI cụ thể! Nó chỉ đơn giản là thông báo về một sự thay đổi. Thật vậy, WPF sử dụng rất nhiều điều này để xác định các thay đổi, nhưng điều đó không có nghĩa đó là giao diện UI. Tôi sẽ so sánh nó với nhận xét sau: " Lốp xe là phụ kiện xe hơi ". Chắc chắn là có, nhưng xe đạp, xe buýt, vv cũng sử dụng nó. Tóm lại, đừng lấy giao diện đó làm giao diện người dùng.

Như đã nói, điều đó không nhất thiết có nghĩa là tôi tin rằng Người mẫu nên cung cấp thông báo. Trong thực tế, như một quy tắc chung, mô hình không nên thực hiện giao diện này, trừ khi nó là cần thiết. Trong hầu hết các trường hợp không có dữ liệu máy chủ nào được đẩy vào ứng dụng khách, mô hình có thể bị cũ. Nhưng nếu nghe dữ liệu thị trường tài chính, thì tôi không hiểu tại sao mô hình không thể thực hiện giao diện. Ví dụ: nếu tôi có logic phi UI như dịch vụ khi nhận được Giá thầu hoặc Hỏi giá cho một giá trị nhất định thì sẽ đưa ra cảnh báo (ví dụ: qua email) hoặc đặt hàng? Đây có thể là một giải pháp sạch có thể.

Tuy nhiên, có nhiều cách khác nhau để đạt được mọi thứ, nhưng tôi sẽ luôn tranh luận về sự đơn giản và tránh sự dư thừa.

Cái gì tốt hơn Xác định các sự kiện trên một bộ sưu tập hoặc các thay đổi thuộc tính trên mô hình khung nhìn và truyền nó tới mô hình hoặc có chế độ xem thực chất cập nhật mô hình (thông qua mô hình khung nhìn)?

Điểm mấu chốt bất cứ khi nào bạn thấy ai đó tuyên bố rằng " bạn không thể làm điều này hoặc điều đó " đó là một dấu hiệu họ không biết họ đang nói về điều gì.

Nó thực sự phụ thuộc vào trường hợp của bạn và trên thực tế MVVM là một khung có rất nhiều vấn đề và tôi vẫn chưa thấy một triển khai MVVM chung trên bảng.

Tôi ước mình có nhiều thời gian hơn để giải thích nhiều hương vị của MVVM và một số giải pháp cho các vấn đề phổ biến - chủ yếu được cung cấp bởi các nhà phát triển khác, nhưng tôi đoán tôi sẽ phải làm điều đó vào lúc khác.


7
Nghĩ theo cách này. Nếu bạn, với tư cách là nhà phát triển sử dụng một mô hình với các Mô hình, bạn chắc chắn sẽ không viết lại chúng để hỗ trợ INotifyPropertyChanged.
Lee Treveil

2
Rất đồng ý với bạn. Giống như tôi, bạn cũng có thể hài lòng khi tìm hiểu tài liệu MVVM chính thức < msdn.microsoft.com/en-us/l Library / gg405484% 28v = pandp.40% 29.aspx > (phần Mô hình) đồng ý với chúng tôi. :-)
Noldorin

"Tuy nhiên, tehre là những cách khác nhau để đạt được mọi thứ nhưng tôi sẽ luôn tranh luận về sự đơn giản và tránh sự dư thừa." Rất quan trọng.
Bastien Vandamme

1
INotifyPropertyChangedlà một phần của System.ComponentModelkhông gian tên dành cho " hành vi thời gian chạy và thời gian thiết kế của các thành phần và điều khiển ". KHÔNG SỬ DỤNG INotifyPropertyChanged trong Mô hình, chỉ trong ViewModels. Liên kết đến tài liệu: docs.microsoft.com/en-us/dotnet/api/system.componentmodel
Igor Popov

1
Bài viết cũ, tôi biết, nhưng tôi thường quay lại nó khi bắt đầu một dự án mới bằng MVVM. Gần đây tôi đã bắt đầu thực thi Nguyên tắc Trách nhiệm Đơn lẻ nghiêm ngặt hơn rất nhiều. Một mô hình là có một trách nhiệm. Để trở thành một người mẫu. Ngay khi bạn thêm INotifyPropertyChanged vào mô hình, nó không còn tuân theo Nguyên tắc Trách nhiệm duy nhất. Toàn bộ lý do ViewModel tồn tại là để cho mô hình là mô hình, để cho mô hình có một trách nhiệm duy nhất.
Rhyous 16/03/19

30

Trong MV-VM, ViewModel luôn luôn (Model không phải lúc nào) thực hiện INotifyPropertyChanged

Kiểm tra Mẫu / Bộ công cụ dự án MV-VM từ http://bloss.msdn.com/llobo/archive/2009/05/01/doad-mv-vm-project-template-toolkit.aspx . Nó sử dụng DelegateCommandđể ra lệnh và nó sẽ là một mẫu khởi đầu tuyệt vời cho các dự án MV-VM của bạn.


Câu đầu tiên đó tổng hợp các lựa chọn của các câu trả lời khác khá tốt, imo. => TĂNG LÊN!
j00hi

13

Tôi nghĩ MVVM được đặt tên rất kém và gọi ViewModel là ViewModel khiến nhiều người bỏ lỡ một tính năng quan trọng của kiến ​​trúc được thiết kế tốt, đó là DataContoder kiểm soát dữ liệu cho dù ai đang cố chạm vào nó.

Nếu bạn nghĩ Mô hình xem giống như một DataContoder và thực hiện một kiến ​​trúc trong đó DataContoder của bạn là mục duy nhất chạm vào dữ liệu, thì bạn sẽ không bao giờ chạm trực tiếp vào dữ liệu mà luôn sử dụng DataContoder. DataContoder hữu ích cho UI nhưng không nhất thiết chỉ dành cho UI. Nó dành cho lớp nghiệp vụ, lớp UI, v.v ...

DataModel -------- DataController ------ View
                  /
Business --------/

Bạn kết thúc với một mô hình như thế này. Ngay cả doanh nghiệp cũng chỉ nên chạm vào dữ liệu bằng ViewModel. Sau đó, câu hỏi hóc búa của bạn sẽ biến mất.


3
Thật tuyệt nếu dữ liệu của bạn chỉ thay đổi khi DataContoder thay đổi. Nếu dữ liệu đến từ cơ sở dữ liệu hoặc một số kho dữ liệu khác có thể cung cấp một con đường khác để thay đổi, bạn có thể cần có cách thông báo cho VIEWMODEL (DataContoder trong mẫu của bạn) và XEM khi điều đó xảy ra. Bạn có thể thăm dò bằng cách sử dụng Trình điều khiển dữ liệu hoặc đẩy từ một số quy trình bên ngoài sang DataModel của bạn và cho phép DataModel của bạn gửi thông báo thay đổi đến DataContoder của bạn.
ScottCher

4
Bạn hoàn toàn chính xác. Thiết kế patters là rất cao cấp. Hầu hết thời gian mẫu thiết kế dẫn bạn làm việc đúng, nhưng cứ thỉnh thoảng họ lại biến bạn sai cách. Bạn không bao giờ nên tránh làm điều gì đó đúng vì nó nằm ngoài mẫu thiết kế của bạn.
Rhyous

Bạn cũng sẽ đẩy tới DataContoder của mình khi nó điều khiển và mô hình dữ liệu và sẽ yêu cầu nó cập nhật.
Rhyous 16/03/19

Ngoài ra, Mô hình trong MVVM nên được giữ cụ thể theo nhu cầu của UI (ví dụ: DTO). Vì vậy, bất kỳ DB hoặc logic kinh doanh phức tạp nào cũng sẽ xảy ra trong một lớp khác và sau đó dữ liệu thô sẽ được cung cấp thông qua mô hình khung nhìn.
Tên mã Jack

9

Nó phụ thuộc vào cách bạn triển khai mô hình của mình. Công ty của tôi sử dụng các đối tượng kinh doanh tương tự như các đối tượng CSLA của Lhotka và sử dụng rộng rãi trong INotifyPropertyChangedtoàn bộ mô hình kinh doanh.

Công cụ xác nhận của chúng tôi phụ thuộc rất nhiều vào việc được thông báo rằng các thuộc tính thay đổi thông qua cơ chế này và nó hoạt động rất tốt. Rõ ràng, nếu bạn đang sử dụng một triển khai khác ngoài các đối tượng kinh doanh trong đó thông báo về các thay đổi không quan trọng đối với hoạt động, bạn có thể có các phương pháp khác để phát hiện thay đổi trong mô hình kinh doanh của mình.

Chúng tôi cũng có các Mô hình xem tuyên truyền các thay đổi từ Mô hình khi cần, nhưng chính các Mô hình xem đang lắng nghe các thay đổi của Mô hình bên dưới.


3
Chính xác thì bạn truyền bá OnPropertyChanged của Model sang OnPropertyChanged như thế nào? Tôi gặp vấn đề khi ViewModel có các tên thuộc tính khác với Model - một loại ánh xạ tên-tên sẽ cần thiết sau đó, phải không?
Martin Konicek

Đó không phải là bất cứ điều gì tinh vi thực sự, chúng tôi chỉ đơn giản là chuyển tiếp các sự kiện. Tôi cho rằng nếu tên khác nhau thì có thể sử dụng bảng tra cứu. Nếu thay đổi không phải là ánh xạ một-một, thì bạn có thể chỉ cần móc sự kiện và sau đó kích hoạt các sự kiện cần thiết trong trình xử lý.
Steve Mitcham

6

Tôi đồng ý với câu trả lời của Paulo, việc triển khai INotifyPropertyChangedMô hình là hoàn toàn chấp nhận được và thậm chí còn được đề xuất bởi Microsoft -

Thông thường, mô hình thực hiện các phương tiện giúp dễ dàng liên kết với chế độ xem. Điều này thường có nghĩa là nó hỗ trợ thông báo thay đổi thuộc tính và bộ sưu tập thông qua INotifyPropertyChangedINotifyCollectionChangedgiao diện. Các lớp mô hình đại diện cho các bộ sưu tập các đối tượng thường xuất phát từ ObservableCollection<T>lớp, cung cấp việc triển khai INotifyCollectionChangedgiao diện.

Mặc dù tùy thuộc vào bạn để quyết định xem bạn có muốn loại triển khai đó hay không, nhưng hãy nhớ -

Điều gì xảy ra nếu các lớp mô hình của bạn không thực hiện các giao diện cần thiết?

Đôi khi bạn sẽ cần phải làm việc với các đối tượng mô hình mà không thực hiện INotifyPropertyChanged, INotifyCollectionChanged, IDataErrorInfo, hoặc INotifyDataErrorInfogiao diện. Trong các trường hợp đó, mô hình khung nhìn có thể cần phải bọc các đối tượng mô hình và hiển thị các thuộc tính cần thiết cho khung nhìn. Các giá trị cho các thuộc tính này sẽ được cung cấp trực tiếp bởi các đối tượng mô hình. Mô hình khung nhìn sẽ triển khai các giao diện cần thiết cho các thuộc tính mà nó hiển thị để chế độ xem có thể dễ dàng liên kết dữ liệu với chúng.

Lấy từ - http://msdn.microsoft.com/en-us/l Library / gg405484 (ParandP.40) .aspx

Tôi đã làm việc trong một số dự án mà chúng tôi chưa thực hiện INotifyPropertyChangedtrong các mô hình của mình và do điều này, chúng tôi đã phải đối mặt với rất nhiều vấn đề; sự trùng lặp không cần thiết của các thuộc tính là cần thiết trong VM và đồng thời chúng tôi phải cập nhật đối tượng cơ bản (với các giá trị được cập nhật) trước khi chuyển chúng sang BL / DL.

Bạn sẽ phải đối mặt với các vấn đề đặc biệt nếu bạn cần làm việc với bộ sưu tập các đối tượng mô hình của mình (giả sử trong một lưới hoặc danh sách có thể chỉnh sửa) hoặc các mô hình phức tạp; các đối tượng mô hình sẽ không được cập nhật tự động và bạn sẽ phải quản lý tất cả những thứ đó trong VM của mình.


3

Nhưng đôi khi mô hình (như trong văn bản liên kết trình bày này ) là dịch vụ, cung cấp cho ứng dụng một số dữ liệu trực tuyến và sau đó bạn cần thực hiện thông báo rằng dữ liệu mới đã đến hoặc dữ liệu đã thay đổi khi sử dụng các sự kiện ...


3

Tôi nghĩ rằng câu trả lời khá rõ ràng nếu bạn muốn tuân thủ MV-VM.

xem: http://msdn.microsoft.com/en-us/l Library / gg405484 (v = ParandP.40) .aspx

Trong mẫu MVVM, khung nhìn đóng gói UI và bất kỳ logic UI nào, mô hình khung nhìn đóng gói logic và trạng thái trình bày và mô hình đóng gói logic và dữ liệu nghiệp vụ.

"Khung nhìn tương tác với mô hình khung nhìn thông qua liên kết dữ liệu, lệnh và thay đổi các sự kiện thông báo. Mô hình khung nhìn truy vấn, quan sát và tọa độ cập nhật cho mô hình, chuyển đổi, xác thực và tổng hợp dữ liệu cần thiết để hiển thị trong chế độ xem."


4
Các trích dẫn được mở để giải thích. Tôi nghĩ bạn nên thêm phần diễn giải của mình, để làm cho câu trả lời của bạn rõ ràng :-)
Søren Boisen

@ John D: Bài viết đó chỉ đưa ra một cách hiểu về MVVM và một cách để thực hiện nó, nó không định nghĩa MVVM.
akjoshi

Hơn nữa, nếu bạn đọc toàn bộ bài viết, nó định nghĩa lớp Model như thế này: "Thông thường, mô hình triển khai các phương tiện giúp dễ dàng liên kết với khung nhìn. Điều này thường có nghĩa là nó hỗ trợ thông báo thay đổi thuộc tính và bộ sưu tập thông qua các giao diện INotifyPropertyChanged và INotifyCollectionChanged Các lớp mô hình đại diện cho các bộ sưu tập các đối tượng thường xuất phát từ lớp <T> của ObservableCollection, cung cấp việc triển khai giao diện INotifyCollectionChanged. "
akjoshi

2

Tôi muốn nói trong ViewModel của bạn. Nó không phải là một phần của Mô hình vì Mô hình là bất khả tri UI. Mô hình phải là 'mọi thứ NGOẠI TRỪ kinh doanh'


2

Việc triển khai INPC trong các mô hình có thể được sử dụng nếu các mô hình được hiển thị rõ ràng trong ViewModel. Nhưng nhìn chung, ViewModel bao bọc các mô hình là các lớp riêng của mình để giảm độ phức tạp của mô hình (không nên hữu ích cho liên kết). Trong trường hợp này, INPC nên được triển khai trong ViewModel.


1

Tôi đang sử dụng INotifyPropertyChangegiao diện trong một mô hình. Trên thực tế, một thay đổi thuộc tính mô hình chỉ nên được kích hoạt bởi UI hoặc máy khách bên ngoài.

Tôi đã nhận thấy một số ưu điểm và nhược điểm:

Ưu điểm

Trình thông báo là trong mô hình kinh doanh

  1. Theo tên miền điều khiển, nó là đúng. Nó nên quyết định khi nào nên nuôi và khi nào không.

Nhược điểm

Mô hình có các thuộc tính (qty, tỷ lệ, hoa hồng, Totalfrieght). Totalfrieght được tính bằng cách sử dụng qty, tỷ lệ, thay đổi hoa hồng.

  1. Khi tải các giá trị từ db, tính toán tổng frieght được gọi là 3 lần (qty, tỷ lệ, hoa hồng). Nó nên là một lần.

  2. Nếu tỷ lệ, qty được gán trong lớp nghiệp vụ, thông báo lại được gọi.

  3. Cần có một tùy chọn để vô hiệu hóa điều này, có thể trong lớp cơ sở. Tuy nhiên, các nhà phát triển có thể quên làm điều này.


Do tất cả các nhược điểm mà bạn đã liệt kê, chúng tôi chỉ quyết định rằng đó là một quyết định SAU trong dự án WPF tương đối lớn của chúng tôi để triển khai INPC trong các mô hình. Họ chỉ nên đối phó với lớp kiên trì. Tất cả những thứ khác như xác nhận, thông báo thay đổi và thuộc tính được tính toán phải được xử lý trong ViewModel. Bây giờ tôi hiểu rõ rằng việc lặp lại các thuộc tính mô hình trong ViewModel KHÔNG phải luôn luôn vi phạm nguyên tắc DRY.
try2fly.b4ucry

1

Tôi nghĩ rằng tất cả phụ thuộc vào trường hợp sử dụng.

Khi bạn có một mô hình đơn giản với vô số thuộc tính, bạn có thể yêu cầu nó triển khai INPC. Nói một cách đơn giản, ý tôi là mô hình này trông khá giống POCO .

Nếu mô hình của bạn phức tạp hơn và sống trong miền mô hình tương tác - mô hình tham chiếu mô hình, đăng ký các sự kiện của mô hình khác - có các sự kiện mô hình được triển khai như INPC là một cơn ác mộng.

Đặt mình vào vị trí của một số thực thể mô hình phải kết hợp với một số mô hình khác. Bạn có nhiều sự kiện để đăng ký. Tất cả chúng được thực hiện dưới dạng INPC. Hãy tưởng tượng những người xử lý sự kiện bạn có. Một tầng lớn các mệnh đề if và / hoặc chuyển đổi clausses.

Một vấn đề khác với INPC. Bạn nên thiết kế các ứng dụng của mình để dựa vào sự trừu tượng, không triển khai. Điều này thường được thực hiện bằng cách sử dụng giao diện.

Chúng ta hãy xem xét 2 cách triển khai khác nhau của cùng một sự trừu tượng hóa:

public class ConnectionStateChangedEventArgs : EventArgs
{
    public bool IsConnected {get;set;}
}

interface IConnectionManagerINPC : INotifyPropertyChanged
{
    string Name {get;}
    int ConnectionsLimit {get;}
    /*

    A few more properties

    */
    bool IsConnected {get;}
}

interface IConnectionManager
{
    string Name {get;}
    int ConnectionsLimit {get;}
    /*

    A few more properties

    */
    event EventHandler<ConnectionStateChangedEventArgs> ConnectionStateChanged;
    bool IsConnected {get;}
}

Bây giờ hãy nhìn vào cả hai. IConnectionManagerINPC nói gì với bạn? Đó là một số tính chất của nó có thể thay đổi. Bạn không biết cái nào trong số chúng. Trong thực tế, thiết kế chỉ thay đổi IsConnected, vì phần còn lại của chúng là chỉ đọc.

Ngược lại, ý định của IConnectionManagers rất rõ ràng: "Tôi có thể nói với bạn rằng giá trị tài sản IsConnected của tôi có thể thay đổi".


1

Chỉ cần sử dụng INotifyPropertyChangetrong chế độ xem của bạn chứ không phải trong Mô hình,

mô hình thường sử dụng IDataErrorInfođể xử lý các lỗi xác thực, vì vậy chỉ cần giữ ViewModel của bạn và bạn đã đúng trên con đường MVVM của mình.


1
Những gì về mô hình với một số tính chất? bạn đang lặp lại mã trong VM.
Luis

0

Giả sử rằng tham chiếu của đối tượng trong chế độ xem của bạn thay đổi. Làm thế nào bạn sẽ thông báo cho tất cả các thuộc tính sẽ được cập nhật để hiển thị các giá trị chính xác? Gọi OnPropertyChangedtheo quan điểm của bạn cho tất cả các thuộc tính của đối tượng là rác rưởi theo quan điểm của tôi.

Vì vậy, những gì tôi làm là để cho chính đối tượng thông báo cho bất kỳ ai khi một giá trị trong thuộc tính thay đổi và theo quan điểm của tôi, tôi sử dụng các ràng buộc như Object.Property1, Object.Property2và trên. Theo cách đó, nếu tôi chỉ muốn thay đổi đối tượng hiện đang được duy trì theo quan điểm của tôi, tôi chỉ cần làm OnPropertyChanged("Object").

Để tránh hàng trăm thông báo trong quá trình tải đối tượng, tôi có một chỉ báo boolean riêng mà tôi đặt thành đúng trong khi tải được kiểm tra từ đối tượng OnPropertyChangedvà không làm gì cả.


0

Thông thường ViewModel sẽ thực hiện INotifyPropertyChanged. Mô hình có thể là bất cứ thứ gì (tệp xml, cơ sở dữ liệu hoặc thậm chí là đối tượng). Mô hình được sử dụng để cung cấp dữ liệu cho viewmodel, truyền vào khung nhìn.

xem ở đây


1
emm .. không. Mô hình không thể là tệp xml hoặc cơ sở dữ liệu. Và mô hình không được sử dụng để cung cấp dữ liệu. Nếu không thì nên gọi là "model" mà là "data" ..? Mô hình được sử dụng để mô tả dữ liệu. Khá tự giải thích, phải không? :)
Taras

1
Nếu bạn có câu trả lời tốt hơn, hãy chia sẻ! tất cả chúng ta đều ở đây để chia sẻ kiến ​​thức và không cạnh tranh
Adam

0

Tôi nghĩ rằng viewmodel thực hiện INotifyPropertyChangevà mô hình có thể sử dụng thông báo ở một "cấp độ" khác.

ví dụ: với một số dịch vụ tài liệu và một đối tượng tài liệu, bạn có một sự kiện documentChanged mà một viewmodel lắng nghe để xóa và xây dựng lại khung nhìn. Trong chế độ xem chỉnh sửa, bạn có một thuộc tính trao đổi cho các thuộc tính của tài liệu để hỗ trợ các khung nhìn. Nếu dịch vụ thực hiện rất nhiều với tài liệu lưu (cập nhật ngày thay đổi, người dùng cuối, v.v.), bạn dễ dàng bị quá tải các sự kiện Ipropertychanged và chỉ cần trao đổi tài liệu là đủ.

Nhưng nếu bạn sử dụng INotifyPropertyChangetrong mô hình của mình, tôi nghĩ rằng đó là cách tốt để chuyển tiếp nó trong chế độ xem của bạn thay vì đăng ký trực tiếp vào chế độ xem của bạn. Trong trường hợp đó khi các sự kiện thay đổi trong mô hình của bạn, bạn chỉ phải thay đổi chế độ xem và chế độ xem không bị ảnh hưởng.


0

Tất cả các thuộc tính, được liên kết với chế độ xem của tôi, đều nằm trong ViewModel (s) của tôi. Vì vậy, họ nên thực hiện giao diện INotifyPropertyChanged. Do đó, Chế độ xem được tất cả các thay đổi.

[Sử dụng bộ công cụ MVVM Light, tôi cho phép chúng kế thừa từ ViewModelBase.]

Mô hình giữ logic kinh doanh, nhưng không liên quan gì đến quan điểm. Do đó, không có nhu cầu về giao diện INotifyPropertyChanged.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.