Как использовать тот же DataTemplate и выполнить привязку к внешним свойствам Dynami c - PullRequest
0 голосов
/ 17 июня 2020

Я успешно настроил свою сетку данных для поддержки filtering. Все, что я сделал, - это создал DataTemplate , который содержал кнопку переключения и всплывающее окно с TextBox , служащим полем поиска фильтра. Я создал по два для каждого столбца (всего 2) таким образом в <DataGrid.Resources></DataGrid.Resources>

Вот мой xaml:

    <DataTemplate x:Key="FooHeaderTemplate">
                        <Grid Margin="0, 0, -5, 0">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition Width="Auto"/>
                            </Grid.ColumnDefinitions>

                            <ContentControl Content="{Binding}" VerticalAlignment="Center"/>
                            <ToggleButton Name="FooFilterButton"  
                                          Grid.Column="1"  
                                          Width="25"
                                          Height="25"
                                          Margin="0, 1, 5, 1"
                                          Padding="1, 0" BorderBrush="{x:Null}" Foreground="{x:Null}" Background="{x:Null}">
                                <ToggleButton.Content>
                                    <Image Stretch="Fill">
                                        <Image.Style>
                                            <Style TargetType="Image">
                                                <Style.Triggers>
                                                    <DataTrigger 
                                                        Binding="{Binding DataContext.IsFooFilterApplied, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Value="True">
                                                        <Setter Property="Source" Value="/Foo.Bar.FooApplication;component/Resources/filter-applied.png"/>
                                                    </DataTrigger>

                                                    <DataTrigger 
                                                        Binding="{Binding DataContext.IsFooFilterApplied, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Value="False">
                                                        <Setter Property="Source" Value="/Foo.Bar.FooApplication;component/Resources/filter-doff.png"/>
                                                    </DataTrigger>
                                                </Style.Triggers>
                                            </Style>
                                        </Image.Style>
                                    </Image>
                                </ToggleButton.Content>
                            </ToggleButton>
                            <Popup IsOpen="{Binding ElementName=FooFilterButton, Path=IsChecked}" PlacementTarget="{Binding ElementName=FooFilterButton}" Placement="Left" StaysOpen="False" HorizontalAlignment="Right">
                            <Border Background="White" Padding="3">
                                    <TextBox Width="300" Text="{Binding DataContext.FooFilterSearchBox, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                </Border>
       </Popup>
    </Grid>
</DataTemplate>

Как видите, у меня есть уникальные свойства, связанные с этим DataTemplate , относящийся к определенному столбцу. Я продублировал этот DataTemplate и изменил его Name и привязку свойств для соответствия следующему столбцу.

В его нынешнем виде работает как надо. Я нажимаю кнопки фильтра, и появляется всплывающее окно, я ввожу строковое значение, и данные таблицы обновляются по мере ввода. Более того, график c для кнопки фильтра изменяется, чтобы указать, когда фильтр применяется для этого конкретного столбца.

Проблема в том, что мне пришлось продублировать тот же DataTemplate . Думаю, все в порядке, если у меня есть только два столбца для фильтрации, но как насчет DataGrid с 7 столбцами, и мне нужно добавить фильтр для каждого?

У меня такой вопрос: есть ли способ использовать только один DataTemplate , а затем изменить его для каждого столбца?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 17 июня 2020

У меня такой вопрос: можно ли каким-либо образом использовать только один DataTemplate, а затем изменить его для каждого столбца?

Краткий ответ: Нет, по крайней мере, не в XAML. Вы должны определить шаблон в целом . Боюсь, вы не можете «унаследовать» все части, кроме привязки.

Вы можете рассмотреть возможность создания шаблонов программно :

Есть ли способ создать DataTemplate только с C#

...