如何对ColumnDefinition的Width或者RowDefinition的Height进行数据绑定?

时间:2020-03-06 14:51:53  来源:igfitidea点击:

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

注意:我将其作为参考问题发布,因为Google无法使我发布,因此我必须自己解决这个问题。我自己的回答如下。

解决方案

我发现了许多陷阱:

  • 尽管在XAML中看起来像是双精度型,但* Definition的Height或者Width的实际值是" GridLength"结构。
  • GridLength的所有属性均为只读,因此每次更改时都必须创建一个新属性。
  • 与WPF中的其他所有属性不同,Width和Height不会将其数据绑定模式默认设置为" 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>

由于我们提出了在" GridLength"和" int"之间进行转换的另一种可能性,是创建一个" IValueConverter"并在绑定到" Width"时使用它。 IValueConverter还可以处理双向绑定,因为它们同时具有ConvertTo()和ConvertBack()方法。