在WPF中,使用视图-模型-视图模型(View-Model-ViewModel)模式时,我尝试绑定网格控件的各种定义的高度和宽度,以便在使用GridSplitter后存储用户设置的值。然而,正常的模式似乎不适用于这些特定属性。
注意:我将此作为参考问题发布,因为谷歌无法帮助我解决问题,我不得不自己解决。接下来会有我的答案。
在WPF中,使用视图-模型-视图模型(View-Model-ViewModel)模式时,我尝试绑定网格控件的各种定义的高度和宽度,以便在使用GridSplitter后存储用户设置的值。然而,正常的模式似乎不适用于这些特定属性。
注意:我将此作为参考问题发布,因为谷歌无法帮助我解决问题,我不得不自己解决。接下来会有我的答案。
创建一个如下所示的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}}" />
我发现了一些需要注意的问题:
因此,我使用了以下代码:
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>
String Properties
是解决这个问题最好的 MVVM 模式。 - Behzad另一种可能性是,既然您提到了在GridLength
和int
之间进行转换,那么可以创建一个IValueConverter
并在绑定到Width
时使用它。 IValueConverter
还处理双向绑定,因为它们具有ConvertTo()
和ConvertBack()
方法。