columnDefinition의 너비 또는 RowDefinition의 높이를 어떻게 데이터를 데이터에 데이터베이션합니까?

StackOverflow https://stackoverflow.com/questions/147908

문제

WPF의 View-Model-ViewModel 패턴 아래에서 그리드 컨트롤에 대한 다양한 정의의 높이와 너비를 데이터를 데이터에 데이터베이션하려고하므로 GridSplitter를 사용한 후 사용자가 설정 한 값을 저장할 수 있습니다. 그러나 정상적인 패턴은 이러한 특정 속성에 대해서는 작동하지 않는 것 같습니다.

참고 : Google이 실패했을 때 게시하고있는 참조 질문으로 이것을 게시하고 있으며 직접 해결해야했습니다. 따라야 할 내 자신의 대답.

도움이 되었습니까?

해결책 2

내가 발견 한 많은 gotchas가있었습니다.

  1. XAML에서 두 배처럼 보일 수 있지만 *정의의 높이 또는 너비의 실제 값은 'gridlength'구조물입니다.
  2. Gridlength의 모든 속성은 Readonly이므로 변경할 때마다 새 특성을 만들어야합니다.
  3. 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. IValueConverterS는 또한 둘 다 가지고 있기 때문에 양방향 바인딩을 처리합니다 ConvertTo() 그리고 ConvertBack() 행동 양식.

가장 쉬운 솔루션은 이러한 속성에 대한 문자열 설정을 사용하여 WPF가 추가 작업없이 gridlengthconverter를 사용하여 자동으로 지원하도록하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top