38

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

注意:我将此作为参考问题发布,因为谷歌让我失望了,我不得不自己解决这个问题。我自己的答案要遵循。

4

4 回答 4

46

创建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;
    }
}

然后,您可以在 Binding 中使用转换器:

<UserControl.Resources>
    <local:GridLengthConverter x:Key="gridLengthConverter" />
</UserControl.Resources>
...
<ColumnDefinition Width="{Binding Path=LeftPanelWidth, 
                                  Mode=TwoWay,
                                  Converter={StaticResource gridLengthConverter}}" />
于 2011-09-09T07:32:58.940 回答
22

我发现了一些陷阱:

  1. 尽管它在 XAML 中可能看起来像双精度,但 *Definition 的高度或宽度的实际值是一个“GridLength”结构。
  2. GridLength 的所有属性都是只读的,每次更改时都必须创建一个新属性。
  3. 与 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>
于 2008-09-29T08:25:28.990 回答
7

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

于 2015-05-06T17:17:07.787 回答
4

另一种可能性,因为您提出了在GridLengthand之间进行转换int,所以在绑定到 时创建IValueConverter并使用它WidthIValueConverters 也处理双向绑定,因为它们同时具有ConvertTo()ConvertBack()方法。

于 2008-09-29T21:33:25.993 回答