如何从C#中类似于VB的静态依赖属性中生成实例化方法
因此,我在用户控件上从VB转换为C#代码时遇到了一点问题,该控件是其他用户控件的基础。特别是回调上的事件处理,尝试从静态对象获取实例方法。我有一个C#作为从属属性:如何从C#中类似于VB的静态依赖属性中生成实例化方法,c#,wpf,vb.net,event-handling,dependency-properties,C#,Wpf,Vb.net,Event Handling,Dependency Properties,因此,我在用户控件上从VB转换为C#代码时遇到了一点问题,该控件是其他用户控件的基础。特别是回调上的事件处理,尝试从静态对象获取实例方法。我有一个C#作为从属属性: public static readonly DependencyProperty ChartDataProperty = DependencyProperty.Register("ChartData", typeof(ObservableCollection<PlotTrend>), typeof(BaseChart)
public static readonly DependencyProperty ChartDataProperty = DependencyProperty.Register("ChartData", typeof(ObservableCollection<PlotTrend>), typeof(BaseChart), new UIPropertyMetadata(new ObservableCollection<PlotTrend>(), ChartDataChanged));
public ObservableCollection<PlotTrend> ChartData
{
get { return (ObservableCollection<PlotTrend>)GetValue(ChartDataProperty); }
set { SetValue(ChartDataProperty, value); }
}
然后,它将访问从该基继承的实例化类,并将在重写方法上激发该类。让我澄清一下,这在VB中工作得很好,但在C中,这种订阅必须有细微的区别。我试图了解VisualStudio可能会自动生成什么,它会给我静态委托,但我需要以某种方式获得实例化方法。我使用的是Telerik的代码转换器,这是最初运行良好的代码:
Public Shared Sub ChartDataChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim o = DirectCast(d, BaseChart)
If Not IsNothing(e.OldValue) Then
Dim OldCollection = TryCast(e.OldValue, ObservableCollection(Of PlotTrend))
RemoveHandler OldCollection.CollectionChanged, AddressOf o.CalculatePlotTrends
End If
If Not IsNothing(e.NewValue) Then
Dim NewCollection = TryCast(e.NewValue, ObservableCollection(Of PlotTrend))
AddHandler NewCollection.CollectionChanged, AddressOf o.CalculatePlotTrends
End If
End Sub
Public MustOverride Sub CalculatePlotTrends()
将
CalulatePlotTrends
事件处理程序的签名更改为:
public abstract void CalculatePlotTrends(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e);
在C#中,必须在事件处理程序的签名中包含参数。为什么在C#代码中使用“ObservableCollection”作为类型,而在VB代码中使用“ObservableCollectionContentNotifying”作为类型?我想澄清一下,这是一个自定义类型,它继承自ObservaleCollection,ObservaleCollection会执行更多通知,但基本问题仍然是引发对这两种类型都很常见的事件“CollectionChanged”。忘记删除它以简化作用域。我相信您的问题是原始VB代码是使用
选项Strict Off编写的,VB创建了一个具有正确签名的隐藏方法,名为CalculatePlotTrends
。尝试使用正确的签名声明CalculatePlotTrends
。是的,只是我没有正确地记住调用事件处理。谢谢
Public Shared Sub ChartDataChanged(d As DependencyObject, e As DependencyPropertyChangedEventArgs)
Dim o = DirectCast(d, BaseChart)
If Not IsNothing(e.OldValue) Then
Dim OldCollection = TryCast(e.OldValue, ObservableCollection(Of PlotTrend))
RemoveHandler OldCollection.CollectionChanged, AddressOf o.CalculatePlotTrends
End If
If Not IsNothing(e.NewValue) Then
Dim NewCollection = TryCast(e.NewValue, ObservableCollection(Of PlotTrend))
AddHandler NewCollection.CollectionChanged, AddressOf o.CalculatePlotTrends
End If
End Sub
Public MustOverride Sub CalculatePlotTrends()
public abstract void CalculatePlotTrends(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e);