数据绑定比手动修改子控件的属性更快吗?

时间:2013-06-19 20:21:40

标签: c# wpf xaml

所以我有几个子控件需要取父控件依赖属性的值。将值绑定到父级的依赖项属性会比创建父级依赖项属性更改时发生的回调方法更快吗?

我准备将其编码为:

    ItemsControl ic = this.signal_viewer_item_control;
    int count = VisualTreeHelper.GetChildrenCount(ic);
    foreach (var item in ic.Items)
    {
      ContentPresenter container = ic.ItemContainerGenerator.ContainerFromItem(item) as ContentPresenter;
      if (container != null)
      {
        SignalGraph sg = container.ContentTemplate.FindName("signal_graph", container) as SignalGraph;
        if (sg != null)
        {
          sg.GraphPenWidth = GraphPenWidth;
          sg.DrawSignals();
        }
      }
    }

这样我只需手动修改子控件graphpenwidth。是否更好地使它成为依赖属性并将其绑定到父的graphpenwidth值?我只是认为创建两个依赖属性是不必要的开销,但我想知道在这种情况下是否有好处

编辑:所以我回去尝试使用依赖属性来比较两者,但是我似乎无法让它工作。

<wpfExp:SignalGraph 
    x:Name="signal_graph"
    Height="75"
    Signal="{Binding}" 
    signal_graph_window_width="{Binding ElementName=signal_box, Path=signal_graph_window_width, Mode=OneWay}"
    X_Scale="{Binding ElementName=signal_box, Path=X_Scale, Mode=OneWay}"
    MaxTimeValue="{Binding Source = {StaticResource ResourceKey=signal_data}, Path = MaxTimeValue, Mode=OneWay}">
  <wpfExp:SignalGraph.GraphPenWidth>
    <Binding ElementName="signal_box" Path="GraphPenWidth" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged" NotifyOnTargetUpdated="True">
    </Binding>
  </wpfExp:SignalGraph.GraphPenWidth>
</wpfExp:SignalGraph>

我在两个属性之间对图表penwidth进行了双向绑定,然后注册了新属性,如下所示:

private static readonly DependencyProperty GraphPenWidthProperty =
  DependencyProperty.Register("GraphPenWidth",
  typeof(int), typeof(SignalGraph),
  new FrameworkPropertyMetadata(new int(), new    PropertyChangedCallback(GraphPenWidthChanged)));
public int GraphPenWidth
{
  get
  {
    return (int)GetValue(GraphPenWidthProperty);
  }
  set
  {
    SetValue(GraphPenWidthProperty, value);
    default_pen = new Pen(Brushes.Green, value);
  }
}
private static void GraphPenWidthChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
  SignalGraph sg = d as SignalGraph;
  sg.DrawSignals();
}

但是在修改时,永远不会调用graphpenwidthchanged回调方法。我想知道它与itemtemplate有什么关系吗?任何可能导致它不更新的线索?

1 个答案:

答案 0 :(得分:2)

如果您对不同的依赖项属性没有大量绑定,则绑定和手动setter之间的性能差异不明显。无论如何,如果您打算使用手动设置器,每次更改属性时在模板中搜索元素 - 不是一个好主意。如何在GetContainerForItemOverride中返回自定义控件并将其模板子项(在您的情况下为SignalGraph)存储为属性(您可以使用GetTemplateChild方法在OnApplyTemplate中获取它)?