如何对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()方法。