在WPF的View-Model-ViewModel模式下,我尝试数据绑定网格控件的各种定义的高度和宽度,所以我可以将用户在使用GridSplitter后设置的值存储。但是,正常模式似乎不适用于这些特定属性。如何数据绑定ColumnDefinition的宽度或RowDefinition的高度?
注意:我发布这个作为参考问题,因为Google发布失败,我必须自己解决这个问题。我自己的答案要遵循。
在WPF的View-Model-ViewModel模式下,我尝试数据绑定网格控件的各种定义的高度和宽度,所以我可以将用户在使用GridSplitter后设置的值存储。但是,正常模式似乎不适用于这些特定属性。如何数据绑定ColumnDefinition的宽度或RowDefinition的高度?
注意:我发布这个作为参考问题,因为Google发布失败,我必须自己解决这个问题。我自己的答案要遵循。
有许多陷阱的我发现:
正是如此,我用下面的代码:
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()
方法。
创建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}}" />
最简单的方法是简单地使用字符串设置这些属性使WPF会使用GridLengthConverter自动支持它们,无需任何额外的工作。
GridLength特定于WPF,因此不属于ViewModel层。 – 2011-09-09 07:33:40
我认为“没有WPF在ViewModel中”是错误的,因为WPF有很多关于MVVM模式的构造,比如数据绑定本身。您可以说“GridLength特定于VIEW”(除非它是域问题的一部分,例如在数据可视化应用程序中,它们的布局和显示方式非常简单)。但肯定它是有争议的... – heltonbiker 2014-01-17 18:24:40