是否可以绑定到装饰元素容器上的属性?

Jus*_*ica 5 c# wpf xaml

在我的WPF应用程序中,我们使用装饰器来显示验证消息,在特定情况下,存在具有多个控件的单行网格,其中一些控件具有验证.我遇到的问题是我想强制错误消息控件的宽度与网格相同,但似乎无法找到从adorner模板引用该网格的方法.以下是我尝试过的示例:

<ControlTemplate x:Key="Local_TopAdornedTemplateWide">
    <StackPanel>
        <AdornedElementPlaceholder x:Name="adornedElement"/>
        <TextBlock MaxWidth="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType=Grid}, ElementName=adornedElement}"
                   TextWrapping="Wrap"
                   Text="{Binding Converter={StaticResource Local_ValidationErrorMessageConverter}}" 
                   Style="{DynamicResource Error_Text}" 
                   Padding="2 1 0 0" 
                   Visibility="{Binding ElementName=adornedElement, Mode=OneWay, Path=AdornedElement.IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"
                   />
    </StackPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

这会导致应用程序因XamlParseException而崩溃.

理想情况下,解决方案不会特定于网格,因此它将获得任何容器类型的宽度,但是现在网格是唯一的用例.

编辑: 这是我们在应用程序中使用的另一个模板的示例; 此模板不适用于我的情况,因为它会将错误限制为上述网格的单个列的宽度:

 <ControlTemplate x:Key="Local_TopAdornedErrorTemplate">
        <StackPanel>
            <AdornedElementPlaceholder x:Name="adornedElement"/>
            <TextBlock MaxWidth="{Binding ElementName=adornedElement, Path=ActualWidth}"
                       TextWrapping="Wrap"
                       Text="{Binding Converter={StaticResource Local_ValidationErrorMessageConverter}}" 
                       Style="{DynamicResource Error_Text}" 
                       Padding="2 1 0 0" 
                       Visibility="{Binding ElementName=adornedElement, Mode=OneWay, Path=AdornedElement.IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"
                       />
        </StackPanel>
    </ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

使用snoop我捕获了以下两个截图(我无法使用其中一个完整的堆栈来防止发布任何专有的)

此镜头显示了我之前提到的网格,其中是正在装饰的FinancialTextBox项目

装饰物品

此镜头显示两件事,以蓝色选择的项目是上一镜头中网格的最高祖先,黄色高亮显示是内容模板中的文本框

装饰器

有了这两个,似乎很明显(基于来自Contango答案的信息)这两个项目并不在同一个视觉树中,这会让我相信我的问题是不可能的.然而,我添加的第二个模板(确实有效)表明来自装饰元素的至少一些视觉信息存在于占位符中.

所以现在我的问题归结为a)这些信息是否包括装饰元素的父级和b)如何通过对不同元素的绑定来访问它?

小智 4

这最终比我试图走的路简单得多。

我正在阅读 AdornedElementPlaceholder 类,并在 MSDN 上看到此条目,并注意到该类实际上有一个名为parent的属性,我尝试了以下绑定,它运行得很好:

MaxWidth="{Binding ElementName=adornedElement, 
                   Mode=OneWay, 
                   Path=AdornedElement.Parent.ActualWidth}"
Run Code Online (Sandbox Code Playgroud)