我正在使用编辑/查看状态进行自定义控制。
我使用默认样式创建了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,当它不可见时 - 它是空的。当我可见 - 绑定开始工作时导航到它
答案 0 :(得分:1)
请在调试时查看输出窗口。您将看到描述绑定问题的errormessage。 wpf rule nr.1:始终检查输出窗口。
原因是您的编辑/视图内容具有不同的NameScope,因此ElementName不起作用。但是,在您的控件中,您可以使用以下内容手动设置NameScope:
Child
在你的情况下你使用的样式和样式有自己的名称范围,所以它不起作用。想象一下,您在多个页面上使用了该样式。应该使用什么元素?
有时您可以使用 var currentScope = NameScope.GetNameScope(this);
NameScope.SetNameScope((UIElement)this.EditContent, currentScope)
,但不能在元素源的直接子元素中使用它,因为当Source={x:Reference elementName}
被解析时元素尚不存在