1

我有一个具有 Items 属性的 CustomControl。一个内部 TabControl 像这样绑定到它:

<Style TargetType="{x:Type local:CustomControl1}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:CustomControl1}">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}">
                    <TabControl Name="PART_TabControl"
                                >
                    </TabControl>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

OnApply 模板:

public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        TabControl tabControl = Template.FindName("PART_TabControl", this) as TabControl;
        foreach (var item in Items)
        {
            Dispatcher.BeginInvoke(new Action(() => tabControl.Items.Add(item)), System.Windows.Threading.DispatcherPriority.ContextIdle);
        }
    }    

为了演示这个问题,我添加了“Dispatcher.BeginInvoke”。一段时间后添加 tabitems 时会出现问题。下面的用法会导致绑定失败:

<ccl:CustomControl1 Name="cc1">
        <ccl:TabItemCollection>
            <TabItem Header="Tab1">
                <TextBox Name="txtData" />
            </TabItem>
            <TabItem Header="Tab2">
                <TextBlock Text="{Binding ElementName=txtData, Path=Text}" />
            </TabItem>
        </ccl:TabItemCollection>
    </ccl:CustomControl1>    

我注意到在窥探文本块后,问题得到解决。从源代码中我看到这段代码完成了这项工作:

BindingExpression expression = BindingOperations.GetBindingExpression(dObj, property);

                if (expression != null && !expression.HasError && expression.Status != BindingStatus.Active)
                {
                    dObj.ClearValue(property);
                    BindingOperations.SetBinding(dObj, property, expression.ParentBindingBase);
                }

由于我在选项卡项中有许多控件,因此这种“修复绑定”代码会导致很多性能问题。

有什么解决方法吗?

4

0 回答 0