我将首先解释我想要做什么。
我有很多 DataGrid,每个 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 'foo' 是一个变量,但使用方式类似于 类型
当您不知道哪个 datagrid 将实现PropertyChanged
事件并使用它时,有没有办法获取类型,以便您可以为所有Datagrid
控件创建泛型事件处理程序?
还是我走错了路?
不确定我是否真的理解您的问题,但是您可以在运行时检查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 处理程序方法。
您无法在 propertyChanged 事件处理程序中获取类型,但可以从 PropertyChangedEventArgs 获取属性名称。 像这样:
private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == "SomePropertyName")
{
//... do your stuf
}
}