如何使用相同的 DataTemplate 并绑定到外部动态属性

How to use the same DataTemplate and bind to outside dynamic properties

我成功设置了我的数据网格以支持 filtering。我所做的只是创建一个 DataTemplate,其中包含一个切换按钮和一个弹出窗口 window,其中 TextBox 作为过滤器搜索框。我在 <DataGrid.Resources></DataGrid.Resources>

中以这种方式为每列创建了两个(总共 2 个)

这是我的 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 和 属性 绑定以适应下一列。

就目前而言,它可以正常工作。我单击过滤器按钮并出现弹出窗口,我输入一个字符串值,table 数据在我键入时更新。此外,过滤器按钮的图形会发生变化,以指示过滤器何时应用于该特定列。

问题是我必须复制相同的 DataTemplate。我想如果我只有两列要过滤就没问题了,但是在有 7 列的 DataGrid 中我需要为每一列添加一个过滤器呢?

我的问题是:有没有什么方法可以只使用一个 DataTemplate 然后按列修改它?

非常感谢!

My question is this: is there any way I use just one DataTemplate and then modify it per column?

简短回答:不,至少 XAML 没有。您必须定义一个模板 。恐怕你不能 "inherit" 除了绑定之外的所有部分。

您可以考虑创建模板 :

Is there a way to build a DataTemplate with only C#