2016-10-12 64 views
0

我需要幫助在我自己的數據結構類中實現INotifyPropertyChanged。這是爲了一個類的分配,但是實現INotifyPropertyChanged是我在上面做的,超出了規定的要求。如何實現INotifyPropertyChanged

我有一個名爲'BusinessRules'的類,它使用SortedDictionary來存儲'Employee'類型的對象。我有一個DataGridView顯示我所有的員工,我想用我的BusinessRules類對象作爲我的DataGridView的數據源。 BusinessRules容器是分配所必需的。我試圖在這個類中實現INotifyPropertyChanged,但沒有成功。

我工作的DataSource是一個BindingList。目前,我正在使用該BindingList作爲'sidecar'容器並將其設置爲我的DataSource。我對BusinessRules類對象所做的每個更改都鏡像到了我的BindingList類對象。但是這顯然是拙劣的編程,我想做得更好。

我試圖在BusinessRules中實現INotifyPropertyChanged,但是當我將實例化的BusinessRules對象設置爲DataSource時,DataGridView不顯示任何內容。我懷疑問題是使用NotifyPropertyChanged()方法。我不知道該怎麼傳遞給它,也不知道如何處理傳入的內容。大多數示例處理更改名稱,但是我更關心何時將新對象添加到SortedDictionary中。

private void NotifyPropertyChanged(Employee emp) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(emp.FirstName)); 
    } 

需要更改哪些內容才能使其正常工作?你會解釋爲什麼我的嘗試不起作用嗎?

我在StackOverflow上形成我的問題是個臭名昭着的錯誤。這不是故意的。請讓我知道您需要的其他信息,我會盡快提供。

Here is a link to my BusinessRules source code

回答

2

如果您閱讀how to implement MVVM上的教程將會非常有幫助。

你想有一個基類實現INotifyPropertyChanged接口。所以你所有的視圖模型都應該從這個基類繼承。

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChangedEvent(string propertyName) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) 
      handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

// This sample class DelegateCommand is used if you wanna bind an event action with your view model 
public class DelegateCommand : ICommand 
{ 
    private readonly Action _action; 

    public DelegateCommand(Action action) 
    { 
     _action = action; 
    } 

    public void Execute(object parameter) 
    { 
     _action(); 
    } 

    public bool CanExecute(object parameter) 
    { 
     return true; 
    } 

#pragma warning disable 67 
    public event EventHandler CanExecuteChanged; 
#pragma warning restore 67 
} 

您的視圖模型應該看起來像這樣。

public sealed class BusinessRules : ViewModelBase 

下面是如何利用RaisePropertyChangedEvent的示例。

public sealed class Foo : ViewModelBase 
{ 
    private Employee employee = new Employee(); 

    private string Name 
    { 
     get { return employee.Name; } 
     set 
     { 
      employee.Name = value; 
      RaisePropertyChangedEvent("Name"); 
      // This will let the View know that the Name property has updated 
     } 
    } 

    // Add more properties 

    // Bind the button Command event to NewName 
    public ICommand NewName 
    { 
     get { return new DelegateCommand(ChangeName)} 
    } 

    private void ChangeName() 
    { 
     // do something 
     this.Name = "NEW NAME"; 
     // The view will automatically update since the Name setter raises the property changed event 
    } 
} 

我真的不知道你想做的事,所以我會離開我的例子是這樣的。更好地閱讀不同的教程,學習曲線有點陡峭。

相關問題