Expander.IsExpanded首次点击后绑定中断

时间:2014-05-13 08:38:44

标签: wpf wpf-controls expander

我可能正在做些什么,但无法弄清楚我的问题。任何帮助都会非常感激:

我有一个名为Section的CustomControl。 Section是可折叠的,因此其ControlTemplate包含Expander。 Expanders IsExpanded-Property通过TemplateBinding绑定到Section的IsExpanded属性。

在某个部分上设置IsExpanded时,Expander会崩溃,但在Expander中使用toggleButton似乎会破坏该绑定。可能通过将本地值设置为Expander的IsExpanded-Property。无论如何,在通过Mouse更改Expander状态后,绑定中断并设置Section的IsExpanded不会执行任何操作。

但是,当将Expander放入视图并将其IsExpanded-Property绑定到视图中的某个DP时,不会发生这种情况。

同样不值得:Snoop在Expander的IsExpanded-Property上没有显示任何绑定。它只显示Value-Source是ParentTemplate。一旦我单击ToggleButton更改IsExpanded,Value-Source就会更改为Local(可能会破坏以前的Binding?)

Section.cs:

public class Section : Control
{
    static Section()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(Section), new FrameworkPropertyMetadata(typeof(Section))); 
    }

    public static readonly DependencyProperty IsExpandedProperty = DependencyProperty.Register(
            "IsExpanded", typeof (bool), typeof (Section), new PropertyMetadata(default(bool)));

    public bool IsExpanded
    {
        get { return (bool) GetValue(IsExpandedProperty); }
        set { SetValue(IsExpandedProperty, value); }
    }
}

Generic.xaml风格:

<Style TargetType="{x:Type local:Section}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:Section}">
                    <Expander Header="Test" IsExpanded="{TemplateBinding IsExpanded}" >
                        <Rectangle Fill="Aqua" Height="200" Width="200" />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

所以我找到的答案实际上是非常基本的知识:

无论MetaData声明什么,TemplateBindings始终是ONEWAY ...

使用:

IsExpanded="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsExpanded}"

解决了我的问题...