私が最初にやろうとしていることを説明します。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
引数の型をチェックして、このような適切なメソッドを呼び出すことができれば
ないあなたが達成しようとしているが、このような 'foo'タイプでエラーを解決することができますかわから:' VAR newRowData = Convert.ChangeType(送信者、FOO); ' – Pikoh
送信者型は常に 'StaffData'か、StaffDataから派生した潜在的な型です。 – Clemens
@Clemens、私は何をしようとしているのかを説明するために1つのクラスを投稿しました。異なるクラス(タイプ)の場合はどうなりますか?特に、すべての異なるクラス(タイプ) – KyloRen