找到同级控件的属性

时间:2019-06-08 02:36:21

标签: c# wpf data-binding

Windows 10 Pro 64,VS 2019社区,WPF应用

我有一个应用程序,该应用程序的UserControl具有两个成员,每个成员都是一个UserControl,其中包含一个标题,标题为2 -3行文本,其下方是一个ListBox。我的目标是将一个标头的高度设置为另一个标头的高度,并且我选择将一个标头绑定到另一个标头来完成此操作。但是,似乎我的RelativeSource没有解析,这导致尝试将高度设置为NaN,这当然不会更改它。我尝试了多种不同的方式来表达RelativeSource,但没有一种起作用。这是最新的:

这是主窗口:

    <Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:MyApp"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <local:MyParentControl x:Name="Daddy"/>
    </Grid>
</Window>

以及包含两个孩子的Parent控件:

<UserControl x:Class="MyApp.MyParentControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyApp"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <StackPanel Orientation="Horizontal">
            <local:MySonControl x:Name="Sonny"/>
            <local:MyDaughterControl x:Name="Girlie"/>
        </StackPanel>
    </Grid>
</UserControl>

第一个子控件:

<UserControl x:Class="MyApp.MySonControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyApp"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Vertical" x:Name="Header">
                <TextBlock Text="Vertical space" HorizontalAlignment="Center"/>
                <TextBlock Text="Sonny's Stuff" HorizontalAlignment="Center"/>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Column A" Margin="5,5,5,5"/>
                    <TextBlock Text="Column B" Margin="5,5,5,5"/>
                    <TextBlock Text="Column C" Margin="5,5,5,5"/>
                </StackPanel>
            </StackPanel>
            <ListBox x:Name="Stuff"/>
        </StackPanel>
    </Grid>
</UserControl>

第二个包含绑定语句:

<UserControl x:Class="MyApp.MyDaughterControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:MyApp"
             mc:Ignorable="d" 
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <StackPanel Orientation="Vertical">
            <StackPanel Orientation="Vertical" x:Name="Header"
                        Height="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=local:MyParentControl}, Path=Sonny.Header.ActualHeight}"
                        >
                <TextBlock Text="Girlie's Stuff" HorizontalAlignment="Center"/>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="Column A" Margin="5,5,5,5"/>
                    <TextBlock Text="Column B" Margin="5,5,5,5"/>
                    <TextBlock Text="Column C" Margin="5,5,5,5"/>
                </StackPanel>
            </StackPanel>
            <ListBox x:Name="Stuff"/>
        </StackPanel>
    </Grid>
</UserControl>

我没有碰到后面的代码,就像VS生成它一样。

这是显示的内容:

enter image description here

我们应该看到的是,右侧标头与左侧标头的高度相同,但是您可以知道,事实并非如此。

我在输出窗口中收到以下错误消息,这意味着它没有解决RelativeSource:

System.Windows.Data Error: 40 : BindingExpression path error: 'Sonny' property not found on 'object' ''MyParentControl' (Name='Daddy')'. BindingExpression:Path=Sonny.Header.ActualHeight; DataItem='MyParentControl' (Name='Daddy'); target element is 'StackPanel' (Name='Header'); target property is 'Height' (type 'Double')

关于我在做什么错的任何想法?

1 个答案:

答案 0 :(得分:2)

使用SharedSizeGroup同步行的高度,并删除GridPanels以支持Grid行:

 <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" SharedSizeGroup="HeaderGroup"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition Height="Auto"></RowDefinition>
            <RowDefinition></RowDefinition>
        </Grid.RowDefinitions>

        <TextBlock Grid.Row="0" Text="Vertical space" HorizontalAlignment="Center"/>
        <TextBlock Grid.Row="1" Text="Sonny's Stuff" HorizontalAlignment="Center"/>
        <StackPanel Grid.Row="2" Orientation="Horizontal">
            <TextBlock Text="Column A" Margin="5,5,5,5"/>
            <TextBlock Text="Column B" Margin="5,5,5,5"/>
            <TextBlock Text="Column C" Margin="5,5,5,5"/>
        </StackPanel>

        <ListBox Grid.Row="3" x:Name="Stuff"/>

    </Grid>
 <Grid IsSharedSizeScope="True">
     <StackPanel Orientation="Horizontal">
         <wpfApp2:MySonControl x:Name="Sonny"/>
         <wpfApp2:MyDaughterControl x:Name="Girlie"/>
     </StackPanel>
 </Grid>
{{1}}

结果:

enter image description here

根据两个子控件的内容,我强烈建议仅使用一个子UserControl并使用MVVM用不同的数据填充它。这样就无需维护两个基本相同的控件。