如何从属性更改事件中获取类型?



我将首先解释我想要做什么。

我有很多 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
}
}

相关内容

  • 没有找到相关文章

最新更新