代码之家  ›  专栏  ›  技术社区  ›  VolkerK

如何数据绑定ColumnDefinition的宽度或RowDefinition的高度?

  •  31
  • VolkerK  · 技术社区  · 16 年前

    在wpf的视图模型view model模式下,我正在尝试数据绑定网格控件的各种定义的高度和宽度,以便在使用网格拆分器后存储用户设置的值。但是,对于这些特定的属性,正常模式似乎不起作用。

    注意:我把这个作为参考问题发布,因为谷歌让我失败了,我不得不自己解决这个问题。我自己的答案。

    4 回复  |  直到 9 年前
        1
  •  38
  •   Anatoliy Nikolaev    10 年前

    创建一个 IValueConverter 如下:

    public class GridLengthConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            double val = (double)value;
            GridLength gridLength = new GridLength(val);
    
            return gridLength;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            GridLength val = (GridLength)value;
    
            return val.Value;
        }
    }
    

    然后可以在绑定中使用转换器:

    <UserControl.Resources>
        <local:GridLengthConverter x:Key="gridLengthConverter" />
    </UserControl.Resources>
    ...
    <ColumnDefinition Width="{Binding Path=LeftPanelWidth, 
                                      Mode=TwoWay,
                                      Converter={StaticResource gridLengthConverter}}" />
    
        2
  •  19
  •   VolkerK    16 年前

    我发现了很多哥特人:

    1. 虽然在XAML中它看起来像一个双精度数,但*定义的高度或宽度的实际值是一个“gridLength”结构。
    2. GridLength的所有属性都是只读的,每次更改它时都必须创建一个新的属性。
    3. 与WPF中的其他所有属性不同,宽度和高度不会将其数据绑定模式默认为“twoway”,您必须手动设置该模式。

    因此,我使用了以下代码:

    private GridLength myHorizontalInputRegionSize = new GridLength(0, GridUnitType.Auto)
    public GridLength HorizontalInputRegionSize
    {
        get
        {
            // If not yet set, get the starting value from the DataModel
            if (myHorizontalInputRegionSize.IsAuto)
                myHorizontalInputRegionSize = new GridLength(ConnectionTabDefaultUIOptions.HorizontalInputRegionSize, GridUnitType.Pixel);
            return myHorizontalInputRegionSize;
        }
        set
        {
            myHorizontalInputRegionSize = value;
            if (ConnectionTabDefaultUIOptions.HorizontalInputRegionSize != myHorizontalInputRegionSize.Value)
            {
                // Set the value in the DataModel
                ConnectionTabDefaultUIOptions.HorizontalInputRegionSize = value.Value;
            }
            OnPropertyChanged("HorizontalInputRegionSize");
        }
    }
    

    和XAML:

    <Grid.RowDefinitions>
        <RowDefinition Height="*" MinHeight="100" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="{Binding Path=HorizontalInputRegionSize,Mode=TwoWay}" MinHeight="50" />
    </Grid.RowDefinitions>
    
        3
  •  4
  •   Joel B Fant    16 年前

    另一种可能性,因为你提出了转换 GridLength int ,是要创建一个 IValueConverter 并在绑定到 Width . iValter转换器 S还处理双向绑定,因为它们都有 ConvertTo() ConvertBack() 方法。

        4
  •  4
  •   JustinMichel    9 年前

    最简单的解决方案是简单地为这些属性使用字符串设置,这样WPF就可以使用GridLengthConverter自动支持这些属性,而不需要做任何额外的工作。