数据绑定是否比手动修改子控件的属性更快
本文关键字:控件 属性 修改 是否 数据绑定 | 更新日期: 2023-09-27 18:19:10
所以我有几个子控件需要接受父控件依赖属性的值。将值绑定到父类的依赖属性会比在父类的依赖属性改变时创建一个回调方法更快吗?
我打算这样编码:
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>
我在两个属性之间设置了一个双向绑定,然后注册了新的属性,如下所示:
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中有关?有什么线索可以导致它不更新吗?
如果你没有大量的绑定到不同的依赖属性,那么绑定和手动设置之间的性能差异是不明显的。无论如何,如果你打算使用手动setter,每次你的属性被改变时都在模板中搜索元素,这不是一个好主意。如何在GetContainerForItemOverride中返回自定义控件并将其模板子(在您的情况下为SignalGraph)存储为属性(您可以使用GetTemplateChild方法在OnApplyTemplate中获取它)?