2017-03-16 10 views
6

W WPF mam konwerter wartości binarnej, który został powiązany z definicjami kolumn i wierszy.Konwerter WPF na kolumnę siatki i długość wiersza działa tylko wtedy, gdy nie jest używany filtr siatki.

Ten konwerter służy do odczytywania powiązanej wartości boolowskiej w celu określenia, czy wiersz/kolumna ma być ukryty, czy pokazany.

Dokonano tego, aby "zmaksymalizować" daną część siatki lub przywrócić ją do pierwotnego rozmiaru. Działa to tak długo, jak nie używam rozmiaru siatki do zmiany rozmiaru. Tak szybko, jak to się dzieje, nie ustawia już żądanej długości. Mam wrażenie, że po skorzystaniu z siatki, usuwa ona powiązanie z definicją kolumny. Czy jest do tego jakieś zadanie?

Converter

[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> 

Edit: Restructured pytanie zawierać więcej XAML

Edycja: Dodatkowe info, kiedy chcą, aby rozwinąć sekcję siatki I ustaw wszystkie wartości logiczne na false i ustaw sekcję, którą chcę, aby była prawdziwa. Na przykład, jeśli chcę zmaksymalizować Grid.Column 2 i Grid.Row 2, ustawiam wszystkie wartości logiczne na false z wyjątkiem ShowColumn2 i ShowRow2. Działa to zgodnie z przeznaczeniem, a gdy wszystkie booleans są ustawione na true, aby przywrócić oryginalny widok, działa również zgodnie z zamierzeniami. Problem polega na tym, że gdy używam opcji gridsplitter do zmiany rozmiaru kolumny, która nie działa tak jak poprzednio. Kiedy zmaksymalizuję tę samą sekcję co poprzednio, działa dobrze, ale kiedy próbuję zmienić rozmiar z powrotem na pierwotny rozmiar Grid.Column 2 i Grid.Row 2 zajmuje cały dolny rząd. Dwie kolumny oprócz nich są zminimalizowane.

Prowadzi mnie to do przekonania, że ​​w przypadku użycia narzędzia gridsplitter konwerter nie będzie już mógł ustawić wartości kolumny na wartość true.

+0

Możesz spróbować użyć konwertera widoczności w zawartości kolumny (siatka, sterpanel, datagrid, itp.) Na podstawie tej samej wartości boolowskiej. W ten sposób nie potrzebujesz konwertera dla GridLength. –

+0

Próbowałem użyć konwertera widoczności i nie zmieniłem rozmiaru pozostałych kolumn, dzięki temu zawartość kolumny zniknęła. Myślę, że powodują to gracze siatki? Używam konwertera widoczności w tym samym widoku i działa zgodnie z przeznaczeniem, ale nie ma w tym siatce elementów siatki. –

+0

@DavidLee, dołącz znaczniki xaml widoku. – ASh

Odpowiedz

1

w twojej ColumnDefinition trzeba ustawić MaxWidth do zera, aby ukryć Column i MaxHeight do zera .

spróbować następujący konwerter:

[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; 
    } 
} 

i Twojego 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> 

także rozważyć usunięcie TwoWay-Binding.

+0

Pracował jak urok. Moje złe z powodu opóźnienia w oznaczaniu tego jako odpowiedzi, ponieważ musiałem ożywić starszą wersję, aby to przetestować. Całkowicie zmieniłem układ interfejsu, ponieważ nie mogłem go uruchomić. –

Powiązane problemy