如何进行数据绑定一个ColumnDefinition的宽度或RowDefinition的高度?(Ho

2019-07-19 16:26发布

下WPF视图模型 - 视图模型模式,我想数据绑定的高地和电网控制各种定义的宽度,这样我就可以使用GridSplitter后,用户将他们的值存储。 然而,正常的模式似乎并没有为这些特定属性的作用。

注:我张贴这为我张贴作为谷歌失败了我,我要工作了这一点,我自己参考的问题。 我自己的答案可循。

Answer 1:

创建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}}" />


Answer 2:

有一些陷阱中,我发现:

  1. 虽然它可能会出现像XAML双,对于*定义的高度或宽度的实际值是“GridLength”结构。
  2. GridLength的所有属性是只读的,你必须创建一个新的每次改变时间。
  3. 不同于WPF,宽度和高度每其他财产不拖欠他们的绑定模式为“双向”,你必须手动设置此。

正是如此,我用下面的代码:

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>


Answer 3:

另一种可能性,因为你长大之间的转换GridLengthint ,是创建IValueConverter并结合使用时,它WidthIValueConverter S还处理双向绑定,因为他们既有ConvertTo()ConvertBack()方法。



Answer 4:

最简单的方法是简单地使用字符串设置这些属性,以便将WPF使用GridLengthConverter没有任何额外的工作,自动支持他们。



文章来源: How do I databind a ColumnDefinition's Width or RowDefinition's Height?