Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#中类似于VB的静态依赖属性中生成实例化方法_C#_Wpf_Vb.net_Event Handling_Dependency Properties - Fatal编程技术网

如何从C#中类似于VB的静态依赖属性中生成实例化方法

如何从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)

因此,我在用户控件上从VB转换为C#代码时遇到了一点问题,该控件是其他用户控件的基础。特别是回调上的事件处理,尝试从静态对象获取实例方法。我有一个C#作为从属属性:

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);