我将首先解释一下我要做的事情。
我有很多DataGrids,每个DataGrid对数据类型使用不同的类,而不是为每个类订阅一个Event处理程序,我希望创建一个通用事件处理程序并从{{获取类型1}}对象。
sender
其中一个类的一个例子:
I am using EntityFramework Database First
我的ViewModel:
VeiwModelBase保存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));
}
}
数据。
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
当尝试将变量用作类型时,我收到此错误,
错误CS0118&#39; foo&#39;是一个变量,但用作a 型
当您不知道哪个数据网格将实现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();
}
事件并使用它时,是否可以获取该类型,以便为所有PropertyChanged
创建一个通用事件处理程序控制?
或者我是以错误的方式解决这个问题?
答案 0 :(得分: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处理程序方法。
答案 1 :(得分:0)
您无法获取propertyChanged事件处理程序中的类型,但您可以从PropertyChangedEventArgs获取属性名称。 类似的东西:
private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == "SomePropertyName")
{
//... do your stuf
}
}