2015-03-04 10 views
11

Có ai biết nếu BindableBase vẫn là khả thi hay chúng ta nên gắn bó với sự kiện INotifyChanged? Có vẻ như BindableBase đã nhanh chóng mất độ bóng của nó. Cảm ơn bạn cho bất kỳ thông tin mà bạn có thể cung cấp.BindableBase vs INotifyChanged

+0

Đối với người mới bắt đầu, BindableBase là một điều lăng kính, vì vậy không liên quan đến vanilla WPF (mặc dù khái niệm có thể là). Bạn có thể cụ thể hơn trong những gì bạn đang yêu cầu? – BradleyDotNET

+0

Tôi sử dụng 'BindableBase' trong các dự án Prism của tôi. Nó vẫn khá bóng bẩy :) –

Trả lời

20

INotifyPropertyChanged

ViewModel nên thực hiện các giao diện INotifyPropertyChanged và nên nâng nó bất cứ khi nào propertychanges

public class MyViewModel : INotifyPropertyChanged 
{ 
    private string _firstName; 


    public event PropertyChangedEventHandler PropertyChanged; 

    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (_firstName == value) 
       return; 

      _firstName = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("FirstName")); 
     } 
    } 


    } 
} 

Vấn đề là với giao diện ICommand như hầu hết các mã được nhân đôi cũng vì nó đi chuỗi nó trở thành dễ bị lỗi.

Trong khi Bindablebase là một lớp trừu tượng mà thực hiện giao diện INotifyPropertyChanged và cung cấp SetProperty<T> .Bạn có thể làm giảm phương pháp thiết lập để chỉ một dòng cũng tham số ref cho phép bạn cập nhật giá trị của nó. Mã BindableBase dưới đây xuất phát từ INotifyPropertyChanged, The .NET 4.5 Way - Revisited

public class MyViewModel : BindableBase 
{ 
    private string _firstName; 
    private string _lastName; 

    public string FirstName 
    { 
     get { return _firstName; } 
     set { SetProperty(ref _firstName, value); } 
    } 


} 

    //Inside Bindable Base 
    public abstract class BindableBase : INotifyPropertyChanged 
    { 

     public event PropertyChangedEventHandler PropertyChanged; 

     protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null) 
     { 
      if (Equals(storage, value)) 
      { 
      return false; 
      } 

      storage = value; 
      this.OnPropertyChanged(propertyName); 
      return true; 
     } 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChangedEventHandler eventHandler = this.PropertyChanged; 
     if (eventHandler != null) 
     { 
      eventHandler(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 
} 
4

Nó không phải là một sự lựa chọn giữa hai.

BindableBase thực hiện INotifyPropertyChanged.

Vì vậy, nếu bạn sử dụng BindableBase, bạn sẽ sử dụng INotifyPropertyChanged.

INotifyPropertyChanged ít nhiều bị bắt buộc khi triển khai MVVM bằng cách sử dụng DataBinding.

Việc sử dụng BindableBase hay triển khai khác tùy thuộc vào sở thích và sử dụng Prism.

+0

Vì vậy, BindableBase là dành riêng cho Prism? Nếu tôi muốn sử dụng Prism và MVVM chuẩn, tôi chỉ nên gắn bó với cách tiếp cận INotifyPropertyChanged. – ChiliYago

+1

@ChiliYago bất kỳ câu trả lời nào là ý kiến ​​thuần túy; tuỳ bạn quyết định. Không có MVVM chuẩn, nó chỉ là một bộ các nguyên tắc giúp bạn phân công trách nhiệm cho các lớp học. Triển khai nào bạn sử dụng không có trong mẫu. –

1

Để mở rộng về câu trả lời Rohit, nếu bạn đang sử dụng .NET 4.6 bạn có thể tận dụng lợi thế của các nhà điều hành Null-có điều kiện và đơn giản hóa các phương pháp OnPropertyChanged theo cách sau:

protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
{ 
    this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
} 

INotifyPropertyChanged, The .NET 4.6 Way giải thích chi tiết hơn.

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