水平拉伸的元素的“绑定宽度”属性

本文关键字:绑定宽度 属性 元素 水平 绑定 | 更新日期: 2023-09-27 18:36:14

我在网格的一列中有一个分组框和网格拆分器控件。组框的水平对齐设置为拉伸,因此当我拖动拆分器时它会占用所有空间。一切正常。

现在我需要将分组框的值存储在绑定对象的属性中,但是一旦我绑定了 width 属性,它就会卡住,它不再在拉伸拆分器时拉伸自己。

我知道原因,因为现在绑定的属性负责其宽度并且没有更改。但不知道如何让它工作。这是我的 XAML。

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Grid x:Name="InnerGrid" HorizontalAlignment="Stretch" Height="{Binding ElementName=Control1,Path=ActualHeight}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto" MinWidth="200"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <GroupBox Header="{Binding TrackName}" VerticalAlignment="Stretch" Margin="3 0 3 0" HorizontalAlignment="Stretch" />
            <GridSplitter Width="5" VerticalAlignment="Stretch" Focusable="False" Background="Gray"/>
        </Grid>
    </DataTemplate>
</ItemsControl.ItemTemplate>

水平拉伸的元素的“绑定宽度”属性

也许您实际上对绑定ColumnDefinition宽度感兴趣,如下所示:

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="{Binding Width}" MinWidth="200"/>
    <ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>

据我了解,您需要读取分组框的计算宽度。为此,可以使用 ActualWidth 属性。

编辑:您可以编写自定义 GroupBox 并使用依赖项属性:

public class MyGroupBox : GroupBox
{
    public static readonly DependencyProperty CurrentWidthProperty =
        DependencyProperty.Register("CurrentWidth", typeof(double),
        typeof(MyGroupBox), new FrameworkPropertyMetadata(0d));
    public double CurrentWidth
    {
        get { return this.ActualWidth; }
        set { SetValue(CurrentWidthProperty, value); }
    }
}

XAML:

<Window x:Class="FunWithWpfAndXP.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:FunWithWp"
        Title="Window1" Height="300" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" MinWidth="200"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        <local:MyGroupBox CurrentWidth="{Binding Path=myProp}" VerticalAlignment="Stretch" Margin="3 0 3 0" HorizontalAlignment="Stretch"/>
        <GridSplitter Width="5"  VerticalAlignment="Stretch"  Focusable="False" Background="Gray"/>
    </Grid>
</Window>

问题是您的绑定正在重置GridSplitter更改的宽度,将GroupBox Width绑定的Mode设置为 OneWayToSource应该(可能)对您有所帮助,您可能会得到这样的结果:

<GroupBox Width="{Binding Path=MyGroupBoxWidth, Mode=OneWayToSource}"/>

MSDN:

OneWayToSource:在目标属性更改时更新源属性。

设置此选项将导致代码中的属性将被更新,但反之则不然