2008-09-29 27 views
28

在WPF的View-Model-ViewModel模式下,我尝试数据绑定网格控件的各种定义的高度和宽度,所以我可以将用户在使用GridSplitter后设置的值存储。但是,正常模式似乎不适用于这些特定属性。如何数据绑定ColumnDefinition的宽度或RowDefinition的高度?

注意:我发布这个作为参考问题,因为Google发布失败,我必须自己解决这个问题。我自己的答案要遵循。

回答

17

有许多陷阱的我发现:

  1. 虽然它可能会出现像XAML双,对于*定义的高度或宽度的实际值是“GridLength”结构。
  2. GridLength的所有属性都是只读的,每次更改时都必须创建一个新属性。
  3. 与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> 
+9

GridLength特定于WPF,因此不属于ViewModel层。 – 2011-09-09 07:33:40

+2

我认为“没有WPF在ViewModel中”是错误的,因为WPF有很多关于MVVM模式的构造,比如数据绑定本身。您可以说“GridLength特定于VIEW”(除非它是域问题的一部分,例如在数据可视化应用程序中,它们的布局和显示方式非常简单)。但肯定它是有争议的... – heltonbiker 2014-01-17 18:24:40

4

另一种可能性,因为你长大GridLengthint之间的转换,是创建一个IValueConverter并在绑定到Width时使用它。 IValueConverter也处理双向绑定,因为它们都有ConvertTo()ConvertBack()方法。

34

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

最简单的方法是简单地使用字符串设置这些属性使WPF会使用GridLengthConverter自动支持它们,无需任何额外的工作。

相关问题