2008-09-29 67 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自動支持它們,無需任何額外的工作。

相關問題