2017-02-28 9 views
1

私が最初にやろうとしていることを説明します。PropertyChangedイベントから型を取得するには?

データグリッドがかなりあり、データグリッドごとに異なるクラスが使用され、それぞれのイベントハンドラをサブスクライブする代わりに、汎用イベントハンドラを作成して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)); 
    }  
} 

私のViewModel:

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();   
    } 
} 

これらは私がこれを理解するように見えることができない上に2つの方法ですが、私はあまり成功し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「fooは」変数であるが、使用されている:私は、私は通常、このことについてつもりですかコメントアウトしています タイプ

ようにあなたがPropertyChangedイベントを実装し、あなたはすべてのDatagrid詐欺のための一般的なイベントハンドラを作ることができるようにそれを使用しますどのDataGridのか分からない時に型を取得する方法はありますトロル?

これは間違った方法ですか?私は別のPropertyChangedを持っていることを好むだろう、しかし

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) 
{ 
    ... 
} 

:私は本当にあなたの質問を理解していますが、実行時にsender引数の型をチェックして、このような適切なメソッドを呼び出すことができれば

+0

ないあなたが達成しようとしているが、このような 'foo'タイプでエラーを解決することができますかわから:' VAR newRowData = Convert.ChangeType(送信者、FOO); ' – Pikoh

+0

送信者型は常に 'StaffData'か、StaffDataから派生した潜在的な型です。 – Clemens

+0

@Clemens、私は何をしようとしているのかを説明するために1つのクラスを投稿しました。異なるクラス(タイプ)の場合はどうなりますか?特に、すべての異なるクラス(タイプ) – KyloRen

答えて

1

わかりません異なる送信者タイプのハンドラメソッド。

+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 
      } 
     } 
関連する問題