2017-03-16 8 views
6

WPFでは、私は列と行の定義にバインドした長さのコンバータのブール値を持っています。グリッドの列と行の長さのWPFコンバータは、グリッドスプリッタが使用されていない場合にのみ動作します

このコンバータは、行/列を非表示にするか表示するかを決定するためにバインドされたブール値を読み取るために使用されます。

これは、グリッドの特定の部分を「最大化」するか、元のサイズに戻すために行われます。これはグリッドスプリッターを使ってサイズを変更しない限り動作します。これが起こるとすぐに、それはもはや所望の長さを設定しない。グリッドスプリッターが使用されると、列定義上のバインディングが削除されているような気がします。このための回避策はありますか?

コンバータ

[ValueConversion(typeof(bool), typeof(GridLength))] 
public class BoolToGridLengthConverter : IValueConverter 
{ 
    public int Length { get; set; } 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((bool)value == true) ? new GridLength(Length == 0 ? 1 : Length, GridUnitType.Star) : new GridLength(0); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { // Don't need any convert back 
     return null; 
    } 
} 

XAML

<Grid> 
    <Grid.Resources> 
     <helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter1" Length="1" /> 
     <helpers:BoolToGridLengthConverter x:Key="BoolToGridLengthConverter2" Length="2" /> 
    </Grid.Resources> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="{Binding ShowColumn1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" /> 
     <ColumnDefinition Width="5" /> 
     <ColumnDefinition Width="{Binding ShowColumn2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" /> 
     <ColumnDefinition Width="5" /> 
     <ColumnDefinition Width="{Binding ShowColumn3, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="{Binding ShowRow1, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter1}}" /> 
     <RowDefinition Height="5" /> 
     <RowDefinition Height="{Binding ShowRow2, Mode=TwoWay, Converter={StaticResource BoolToGridLengthConverter2}}" /> 
    </Grid.RowDefinitions> 
    <Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid> 
    <GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" /> 
    <Grid Grid.Column="0" Grid.Row="2"></Grid> 
    <GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" /> 
    <Grid Grid.Column="2" Grid.Row="2"></Grid> 
    <GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" /> 
    <Grid Grid.Column="4" Grid.Row="2"></Grid> 
</Grid> 

編集:再編もっとXAMLを含むように質問

編集:追加情報、私はグリッドセクションを展開したいIすべてのブール値をfalseに設定し、私が真にしたいセクションを設定します。たとえば、Grid.Column 2とGrid.Row 2を最大化したい場合は、ShowColumn2とShowRow2を除くすべてのブール値をfalseに設定します。これは意図したとおりに動作し、ブール値がすべてtrueに設定されている場合、元のビューを元に戻すために、意図したとおりに動作します。問題は、グリッドスプリッターを使用して以前と同じように動作しない列のサイズを変更した後です。以前と同じセクションを最大化するとうまくいきますが、元のサイズのGrid.Column 2にリサイズしようとすると、Grid.Row 2が一番下の行全体を占めます。それ以外の2つの列は最小化されています。

これは、グリッドスプリッタを使用すると、コンバータが列の値をtrueに設定できなくなると考えています。で

+0

同じブール値に基づいて、列のコンテンツ(グリッド、スタックパネル、データグリッドなど)で可視性コンバータを使用できます。この方法では、GridLengthのコンバータは必要ありません。 –

+0

可視性コンバータを使用しようとしましたが、他の列のサイズを変更していないため、列の内容が消えてしまいました。私はグリッドスプリッターがこれを引き起こしていると思っていますか? Visibility Converterを同じビューで使用し、意図したとおりに動作しますが、グリッド内にグリッドスプリッタはありません。 –

+0

@DavidLee、ビューのxamlマークアップを含めてください。 – ASh

答えて

1

ColumnDefinitionあなたがのためにゼロにColumnMaxHeightを非表示にするMaxWidthゼロに設定する必要があります。

には、以下のコンバータを試してみてください。

[ValueConversion(typeof(bool), typeof(double))] 
public class BoolToMaxConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((bool)value == true) ? double.MaxValue : 0d; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { // Don't need any convert back 
     return null; 
    } 
} 

とあなたのXAML:

<Grid> 
    <Grid.Resources> 
     <local:BoolToMaxConverter x:Key="BoolToMaxConverter" /> 
    </Grid.Resources> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MaxWidth="{Binding ShowColumn1, Converter={StaticResource BoolToMaxConverter}}" /> 
     <ColumnDefinition Width="5" /> 
     <ColumnDefinition MaxWidth="{Binding ShowColumn2, Converter={StaticResource BoolToMaxConverter}}" /> 
     <ColumnDefinition Width="5" /> 
     <ColumnDefinition MaxWidth="{Binding ShowColumn3, Converter={StaticResource BoolToMaxConverter}}" /> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition MaxHeight="{Binding ShowRow1, Converter={StaticResource BoolToMaxConverter}}" /> 
     <RowDefinition Height="5" /> 
     <RowDefinition MaxHeight="{Binding ShowRow2, Converter={StaticResource BoolToMaxConverter}}" /> 
    </Grid.RowDefinitions> 
    <Grid Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="0"></Grid> 
    <GridSplitter Grid.Column="0" Grid.ColumnSpan="5" Grid.Row="1" ResizeDirection="Rows" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Height="5" /> 
    <Grid Grid.Column="0" Grid.Row="2"></Grid> 
    <GridSplitter Grid.Column="1" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" /> 
    <Grid Grid.Column="2" Grid.Row="2"></Grid> 
    <GridSplitter Grid.Column="3" Grid.Row="2" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="5" /> 
    <Grid Grid.Column="4" Grid.Row="2"></Grid> 
</Grid> 

TwoWay-Bindingを削除することを検討してください。

+0

チャームのように働いた。私はこれをテストするために古いバージョンを復活させなければならなかったので、これを答えとしてマークするのが遅れました。私はそれを動作させることができなかったので、私はUIレイアウトを完全に変更しました。 –

関連する問題