如何对ColumnDefinition的Width或RowDefinition的高度进行数据绑定?
-
02-07-2019 - |
题
在WPF的View-Model-ViewModel模式下,我试图对网格控件的各种定义的高度和宽度进行数据绑定,因此我可以在使用GridSplitter后存储用户设置它们的值。但是,正常模式似乎不适用于这些特定属性。
注意:我将此作为参考问题发布,因为谷歌让我失望,我必须自己解决这个问题。我自己的回答。
解决方案 2
我发现了许多陷阱:
- 虽然它在XAML中看起来像是双精度,但* Definition的高度或宽度的实际值是'GridLength'结构。
- GridLength的所有属性都是只读的,每次更改时都必须创建一个新属性。
- 与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>
其他提示
创建 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}}" />
另一种可能性,因为你在 GridLength
和 int
之间进行转换,就是创建一个 IValueConverter
并在绑定到宽度代码>。
IValueConverter
也处理双向绑定,因为它们同时具有 ConvertTo()
和 ConvertBack()
方法。
最简单的解决方案是简单地为这些属性使用字符串设置,以便WPF将使用GridLengthConverter自动支持它们,而无需任何额外的工作。
不隶属于 StackOverflow