在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