如何从PropertyChanged事件中获取Type?

时间:2017-02-28 11:59:49

标签: c# wpf events mvvm event-handling

我将首先解释一下我要做的事情。

我有很多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创建一个通用事件处理程序控制?

或者我是以错误的方式解决这个问题?

2 个答案:

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