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
            }
        }