当Visibility = Collapsed

时间:2015-06-02 09:46:47

标签: c# wpf

我正在使用编辑/查看状态进行自定义控制。

我使用默认样式创建了2个dependencyProperties:

<Setter Property="EditContent">
    <Setter.Value>
        <TextBox Text="{Binding ElementName=parent, Path=LocalValue}" />
    </Setter.Value>
</Setter>
<Setter Property="ViewContent">
    <Setter.Value>
        <TextBox IsEnabled="False" Text="{Binding ElementName=parent, Path=LocalValue}" />
    </Setter.Value>
</Setter>

然后,根据IsReadOnly值显示这些内容,如下所示:

<Border Background="Transparent"
        MouseLeftButtonDown="UIElement_OnMouseLeftButtonDown"
        Visibility="{Binding ElementName=parent,
                                Path=IsReadOnly,
                                Converter={StaticResource BooleanToCollapsingVisibilityConverter},
                                ConverterParameter=true}">
    <ContentPresenter Content="{Binding ElementName=parent, Path=ViewContent}" />
</Border>

问题是,当我的控件加载IsReadOnly = true时,Content Property的ContentPresenter的EditContent为空。

当我更改IsReadOnly to false EditContent的内容时,我的约束不起作用(就像它没有评估)。

如何重新评估WPF中的绑定,或强制ContentPresenter加载已创建的内容(即使它不可见)?

P.S。如果我在Snoop(或WPF Inspector)中导航到此ContentPresenter,当它不可见时 - 它是空的。当我可见 - 绑定开始工作时导航到它

1 个答案:

答案 0 :(得分:1)

  1. 请在调试时查看输出窗口。您将看到描述绑定问题的errormessage。 wpf rule nr.1:始终检查输出窗口。

  2. 原因是您的编辑/视图内容具有不同的NameScope,因此ElementName不起作用。但是,在您的控件中,您可以使用以下内容手动设置NameScope:

  3. Child

    在你的情况下你使用的样式和样式有自己的名称范围,所以它不起作用。想象一下,您在多个页面上使用了该样式。应该使用什么元素?

    有时您可以使用 var currentScope = NameScope.GetNameScope(this); NameScope.SetNameScope((UIElement)this.EditContent, currentScope) ,但不能在元素源的直接子元素中使用它,因为当Source={x:Reference elementName}被解析时元素尚不存在

    1. 从不在样式中设置类似内容的属性。如果您将样式应用于多个元素,则ViewContent中的相同TextBox将多次添加到可视树中,并引发异常。您应该使用DataTemplates而不是样式中的直接内容