gpt4 book ai didi

c# - 当 Visibility=Collapsed 时 WPF ContentPresenter Content 为 null

转载 作者:太空宇宙 更新时间:2023-11-03 13:06:36 25 4
gpt4 key购买 nike

我正在制作具有编辑/查看状态的自定义控件。

我制作了 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 时,EditContent 的 ContentPresenter 的 Content Property 为 null。

当我将 IsReadOnly 更改为 false 时,加载了 EditContent 的内容,但我的绑定(bind)不起作用(就像它未被评估一样)。

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

附言如果我在 Snoop(或 WPF Inspector)中导航到这个 ContentPresenter,当它不可见时 - 它是空的。当我导航到它时它可见 - 绑定(bind)开始工作

最佳答案

  1. 请在调试时查看输出窗口。您将看到描述绑定(bind)问题的错误消息。 wpf 规则 nr.1:始终检查输出窗口。

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

 var currentScope = NameScope.GetNameScope(this);
NameScope.SetNameScope((UIElement)this.EditContent, currentScope)

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

有时你可以使用Source={x:Reference elementName},但是你不能在源元素的直接子元素中使用它,因为元素还不存在,当 {x:Reference} 正在解析

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

关于c# - 当 Visibility=Collapsed 时 WPF ContentPresenter Content 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30592640/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com