如果父元素位于 WPF 中的另一个文件中,如何绑定到父元素

本文关键字:元素 何绑定 绑定 另一个 WPF 文件 如果 | 更新日期: 2023-09-27 18:34:28

>我有一个"详细信息视图",需要在其他视图之间共享。

使用"详细信息视图"的视图示例

此代码位于用户控件中 ParentView.xaml

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*" Name="detailsRowDefinition"/>
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0"...>
    <StackPanel Grid.Row=1 HorizontalAlignment="Center">
        <!--This is what I'd like to get ActualHeight from-->
        <!--I've tried to get ActualHeight from the RowDefinition as well-->
        <ContentControl Name="detailsView" Content="{Binding Details}"/>
    </StackPanel>
</Grid>

然后另一个 xaml 文件确保上面ContentControl中的 {绑定详细信息} 正常工作,并且它正确呈现我的详细信息视图。

现在,在另一个文件DetailsView.xaml(也是用户控件(中

<TabControl>
    <TabItem Header="Part A">
        <!--This is the blasted ScrollViewer that I can't set the height on-->
        <ScrollViewer Height="{Binding Path=ActualHeight, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=RowDefinition}}" >
            <!--Lots of crap-->
        </ScrollViewer>
    </TabItem>
    <TabItem Header="Part B">
    </TabItem>
    <!--etc-->
<TabControl>

我尝试了不同的绑定变体,例如ElementName和设置AncestorLevel非常高等。

我要得到的答案是这样的:如何在 WPF 中将高度设置为自动的情况下使滚动查看器工作?除了我需要绑定到嵌入this用户控件的用户控件的父元素

这个问题的答案似乎是我想做的,但在代码片段方面没有任何帮助。如何获取具有行定义高度 * 的网格的实际网格行高

如果父元素位于 WPF 中的另一个文件中,如何绑定到父元素

RowDefinition 不充当包含 contol,因此您无法将其作为祖先找到。但是你并不真正需要它,你可以使用父面板(在你的例子中是StackPanel(:

<TabItem Header="Part A">
    <ScrollViewer Height="{Binding ActualHeight, RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel}}">
        <TextBlock Text="Here we are" />
    </ScrollViewer>
</TabItem>

为了节省时间,我决定为 SizeChanged 提供一个事件处理程序,就像Parent.xaml<UserControl SizeChanged="Control_SizeChanged">元素

一样
    private void Control_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        if (e.HeightChanged)
        {
            var height = this.detailsRowDefinition.ActualHeight;
            this.detailsView.Height = height;
        }
    }