ColumnDefinitionの幅またはRowDefinitionの高さをデータバインドするにはどうすればよいですか?
-
02-07-2019 - |
質問
WPFのView-Model-ViewModelパターンの下で、グリッドコントロールのさまざまな定義のHeightsとWidthsをデータバインドして、GridSplitterの使用後にユーザーが設定した値を保存できるようにします。ただし、これらの特定のプロパティでは通常のパターンは機能しないようです。
注:これは参考質問として投稿していますが、Googleが失敗し、自分で解決しなければならなかったので投稿しています。従うべき私自身の答え。
解決 2
私が発見したいくつかの落とし穴がありました:
- XAMLではdoubleのように見えますが、* DefinitionのHeightまたはWidthの実際の値は 'GridLength'構造です。
- GridLengthのプロパティはすべて読み取り専用です。変更するたびに新しいプロパティを作成する必要があります。
- WPFの他のすべてのプロパティとは異なり、幅と高さはデータバインディングモードをデフォルトで「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>
他のヒント
次のように 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}}" />
GridLength
と int
の変換を開始したため、別の可能性として、 IValueConverter
を作成して、 >幅
。 IValueConverter
は、 ConvertTo()
メソッドと ConvertBack()
メソッドの両方を備えているため、双方向バインディングも処理します。
最も簡単な解決策は、これらのプロパティに文字列設定を使用するだけで、WPFがGridLengthConverterを使用して追加の作業なしで自動的にサポートするようにすることです。
所属していません StackOverflow