如何对ColumnDefinition的Width或RowDefinition的高度进行数据绑定?

时间:2008-09-29 08:18:32

标签: wpf data-binding grid column-width row-height

在WPF的View-Model-ViewModel模式下,我试图对网格控件的各种定义的高度和宽度进行数据绑定,因此我可以在使用GridSplitter后存储用户设置它们的值。但是,正常模式似乎不适用于这些特定属性。

注意:我将此作为参考问题发布,因为谷歌让我失望,我必须自己解决这个问题。我自己的回答。

4 个答案:

答案 0 :(得分:39)

按如下方式创建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}}" />

答案 1 :(得分:20)

我发现了许多陷阱:

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

    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>
    

答案 2 :(得分:4)

由于您在GridLengthint之间进行转换,另一种可能性是创建IValueConverter并在绑定到Width时使用它。 IValueConverter也处理双向绑定,因为它们同时具有ConvertTo()ConvertBack()方法。

答案 3 :(得分:4)

最简单的解决方案是简单地为这些属性使用字符串设置,以便WPF将使用GridLengthConverter自动支持它们,而无需任何额外的工作。