2017-02-28 59 views
1

我會解釋我想要做的第一件事。如何從PropertyChanged事件獲取類型?

我有相當多的DataGrid中的每個數據網格使用不同類有數據類型和,而不是訂閱的事件處理每一個,我希望做一個普通的事件處理程序,並從sender獲得類型目的。

的類之一的I am using EntityFramework Database First

一個例子:

public partial class StaffData : INotifyPropertyChanged 
{ 
    public long ID { get; set; }   
    public string StaffNameFirst { get; set; } 
    public string StaffNameSecond { get; set; } 

    public event PropertyChangedEventHandler PropertyChanged; 

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

我的視圖模型:

VeiwModelBase保持INotifyPropertyChanged數據。

public class MasterViewModel : ViewModelBase 
{ 
    public static ObservableCollection<StaffData> MasterDataBinding 
    { 
     get { return _mMasterData; } 
     private set 
     { 
      if (value == _mMasterData) 
       return; 

      _mMasterData = value; 
      OnPropertyChanged(); 
     } 
    } 

    public MasterViewModel() 
    { 
     _mMasterData.CollectionChanged += master_CollectionChanged; 
    } 


    public void master_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
    { 
     //asign PropertyChanged event here 
    } 

    private void master_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     Type foo = sender.GetType().GetGenericArguments()[0]; 
     var newRowData = sender as foo;      
     SaveData(newRowData); 
    } 

    private static void SaveData(object newRowData) 
    {  
     Type foo = newRowData.GetType().GetGenericArguments()[0]; 
     var originalData = dataBaseEntities.foo.FirstOrDefault(p => p.ID == newRowData.ID); 
     entities.Entry(originalData).CurrentValues.SetValues(newRowData); 
     dataBaseEntities.SaveChanges();   
    } 
} 

這是兩種方法,我似乎上面不能算出這個,我曾嘗試使用Getype沒有太大的成功,無數的方法(我離開了我的最後一次嘗試中希望說明什麼,我想做)。我註釋掉我怎麼通常要對這個:

private void master_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    Type foo = sender.GetType().GetGenericArguments()[0]; 
    var newRowData = sender as foo; 
    //var newRowData = sender as StaffData    
    SaveData(newRowData); 
} 

//private static void SaveData(StaffData newRowData) 
private static void SaveData(object newRowData) 
{  
    Type foo = newRowData.GetType().GetGenericArguments()[0]; 
    var originalData = dataBaseEntities.foo.FirstOrDefault(p => p.ID == newRowData.ID); 
    //var originalData = dataBaseEntities.StaffData.FirstOrDefault(p => p.ID == newRowData.ID); 
    entities.Entry(originalData).CurrentValues.SetValues(newRowData); 
    entities.SaveChanges();   
} 

當試圖使用變量作爲類型我得到這個錯誤,

錯誤CS0118「富」是一個變量,但使用像 型

是否有一種方式來獲得的類型,當你不知道哪個數據網格將實現PropertyChanged事件,並用它使你可以做一個普通的事件處理程序,所有的Datagrid CON trols?

或者我正在做這個錯誤的方式嗎?

+0

不知道你想什麼來實現,但可以用'foo'型這樣解決錯誤:'VAR newRowData = Convert.ChangeType(發件人,FOO);' – Pikoh

+0

發送者的類型始終是'StaffData'或派生自StaffData的潛在類型。 – Clemens

+0

@Clemens,我發佈了一個類來說明我正在嘗試做什麼,當它是一個不同的類(Type)時會發生什麼,特別是當我希望對所有不同的類(類型)只使用一個事件處理程序時。 – KyloRen

回答

1

不知道如果我真的能理解你的問題,但你可以在運行時檢查sender參數的類型,並調用這樣一個適當的方法:

private void master_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (sender is StaffData) 
    { 
     DoSomething((StaffData)sender); 
    } 
    else if (sender is SomeOtherData) 
    { 
     DoSomething((SomeOtherData)sender); 
    } 
    ... 
} 

private void DoSomething(StaffData data) 
{ 
    ... 
} 

private void DoSomething(SomeOtherData data) 
{ 
    ... 
} 

不過,我更願意有不同的PropertyChanged處理器方法適用於不同的發送者

+0

我有20個班,我希望避免這個。歡呼 – KyloRen

+0

我想在運行時獲得'type',所以我可以用它來查詢數據庫或更新數據。 – KyloRen

+0

你當然可以在運行時用'sender.GetType()'獲得類型,但是該怎麼做呢?你仍然必須有不同的方法來處理不同的類型。你可以使用Type的'GUID'或'FullName'屬性作爲鍵。 – Clemens

0

你不能在propertyChanged事件處理程序中獲取類型,但可以從PropertyChangedEventArgs獲取屬性名稱。 喜歡的東西:

private void OnPropertyChanged(object sender, PropertyChangedEventArgs args) 
     { 
      if (args.PropertyName == "SomePropertyName") 
      { 
       //... do your stuf 
      } 
     }