columnDefinition의 너비 또는 RowDefinition의 높이를 어떻게 데이터를 데이터에 데이터베이션합니까?
-
02-07-2019 - |
문제
WPF의 View-Model-ViewModel 패턴 아래에서 그리드 컨트롤에 대한 다양한 정의의 높이와 너비를 데이터를 데이터에 데이터베이션하려고하므로 GridSplitter를 사용한 후 사용자가 설정 한 값을 저장할 수 있습니다. 그러나 정상적인 패턴은 이러한 특정 속성에 대해서는 작동하지 않는 것 같습니다.
참고 : Google이 실패했을 때 게시하고있는 참조 질문으로 이것을 게시하고 있으며 직접 해결해야했습니다. 따라야 할 내 자신의 대답.
해결책 2
내가 발견 한 많은 gotchas가있었습니다.
- XAML에서 두 배처럼 보일 수 있지만 *정의의 높이 또는 너비의 실제 값은 'gridlength'구조물입니다.
- Gridlength의 모든 속성은 Readonly이므로 변경할 때마다 새 특성을 만들어야합니다.
- 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>
다른 팁
a 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
그리고 바인딩 할 때 사용하십시오 Width
. IValueConverter
S는 또한 둘 다 가지고 있기 때문에 양방향 바인딩을 처리합니다 ConvertTo()
그리고 ConvertBack()
행동 양식.
가장 쉬운 솔루션은 이러한 속성에 대한 문자열 설정을 사용하여 WPF가 추가 작업없이 gridlengthconverter를 사용하여 자동으로 지원하도록하는 것입니다.
제휴하지 않습니다 StackOverflow