WPF Изменить Grid.ColumnSpan на триггере - PullRequest
2 голосов
/ 04 декабря 2009

tl; dr: Я хочу, чтобы подробные виды отображались в 2 столбцах, если выбраны 2 элемента, и в 2 столбцах, если выбран только 1 элемент.

У меня есть DockPanel с 2 ListBox, закрепленными слева, и 2-столбцовая Grid справа.

Когда элемент выбран в listBox1, я отображаю подробное представление в столбце 0 таблицы.

Когда элемент выбран в listBox2, я отображаю подробное представление в столбце 1 таблицы.

    <DockPanel>

        <StackPanel DockPanel.Dock="Left" Orientation="Horizontal">
            <ListBox x:Name="listBox1" ItemsSource="{Binding Items1}" SelectedItem="{Binding SelectedItem1}"/>                    
            <ListBox x:Name="listBox2" ItemsSource="{Binding Items2}" SelectedItem="{Binding SelectedItem2}"/>
        </StackPanel>

        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="*" />
            </Grid.ColumnDefinitions>

            <ContentControl Grid.Column="0" Content="{Binding SelectedItem1}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}"/>
            <ContentControl Grid.Column="1" Content="{Binding SelectedItem2}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}"/>
        </Grid>

    </DockPanel>

Это отлично работает. Однако я хотел бы изменить его так, чтобы представление сведений охватывало оба столбца сетки , когда элемент выбран в одном из списков, но не в другом.

Моей первой мыслью было создание пары DataTriggers, которые изменяют ColumnSpan ContentControls на основе SelectedIndex ListBoxes.

Это прекрасно работает для представления сведений, которое обычно находится в Grid.Column = "0". Однако он не работает для подробного представления, которое обычно находится в Grid.Column = "1", поскольку исходный номер столбца жестко задан:

            <ContentControl Grid.Column="0" Content="{Binding SelectedItem1}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}">
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=listBox2, Path=SelectedIndex}" Value="-1">
                                <Setter Property="Grid.ColumnSpan" Value="2"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>

            <ContentControl Grid.Column="1" Content="{Binding SelectedItem2}" ContentTemplateSelector="{StaticResource SelectedItemTemplateSelector}">
                <ContentControl.Style>
                    <Style TargetType="ContentControl">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=listBox1, Path=SelectedIndex}" Value="-1">
                                <!--Can't modify Grid.Column since it's hardcoded above!-->
                                <Setter Property="Grid.Column" Value="0"/>
                                <Setter Property="Grid.ColumnSpan" Value="2"/>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </ContentControl.Style>
            </ContentControl>

Если бы я мог создать DataTrigger, который мог бы сравнивать значения со списком ListBox.SelectedIndex (т. Е.> = 0), тогда я мог бы избежать жесткого кодирования номеров столбцов.

Есть ли способ сделать что-то подобное в XAML?

Ответы [ 2 ]

0 голосов
/ 15 февраля 2013

Вы всегда можете сделать трюк со скрытыми элементами. В приведенном ниже примере вы просто измените bindme на 2, и диапазон Grids изменится. Я делаю это со всеми типами вещей, которые нельзя анимировать с помощью раскадровки.

<Прямоугольник x: Name = "bindme" Width = "0" Height = "0" Tag = "1" />

0 голосов
/ 17 декабря 2009

В итоге я реализовал преобразователь, описанный здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...