C# 如何从PropertyChanged事件获取类型?
我会先解释我想做什么 我有很多数据网格,每个数据网格对这些数据类型使用不同的类,我不希望为每个数据类型订阅事件处理程序,而是希望创建一个通用事件处理程序,并从C# 如何从PropertyChanged事件获取类型?,c#,wpf,events,mvvm,event-handling,C#,Wpf,Events,Mvvm,Event Handling,我会先解释我想做什么 我有很多数据网格,每个数据网格对这些数据类型使用不同的类,我不希望为每个数据类型订阅事件处理程序,而是希望创建一个通用事件处理程序,并从发送方对象获取类型 我首先使用EntityFramework数据库 其中一个类的一个示例: public partial class StaffData : INotifyPropertyChanged { public long ID { get; set; } public string StaffNam
发送方
对象获取类型
我首先使用EntityFramework数据库
其中一个类的一个示例:
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();
}
}
当尝试将该变量用作类型时,我遇到此错误
错误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
}
}
不确定您试图实现什么,但可以使用如下
foo
类型解决错误:var newRowData=Convert.ChangeType(发送方,foo)
发件人的类型始终是StaffData
或从StaffData派生的潜在类型。@Clemens,我发布了一个类来说明我试图做什么,当它是不同的类(类型)时会发生什么,特别是当我希望对所有不同的类(类型)只使用一个事件处理程序时.我的问题不清楚我想做什么吗?谢谢,我还是看不清楚。对于你正在尝试做的,我在之前的评论中建议的可能有效,但我想你想要的是我有大约20门课,我希望避免这种情况。Cheers我想在运行时获取类型
,这样我就可以使用它来查询数据库或更新新数据。当然,您可以使用sender.GetType()
在运行时获取类型,但是接下来该怎么办呢?您仍然必须有处理不同类型的不同方法。您可能会使用该类型的GUID
或FullName
属性作为键。我被一个普通的活动吸引住了,以至于我看不见森林也看不见树木。你完全正确。
private void OnPropertyChanged(object sender, PropertyChangedEventArgs args)
{
if (args.PropertyName == "SomePropertyName")
{
//... do your stuf
}
}