如何使用相同的 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#
我成功设置了我的数据网格以支持 filtering
。我所做的只是创建一个 DataTemplate,其中包含一个切换按钮和一个弹出窗口 window,其中 TextBox 作为过滤器搜索框。我在 <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 和 属性 绑定以适应下一列。
就目前而言,它可以正常工作。我单击过滤器按钮并出现弹出窗口,我输入一个字符串值,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 没有。您必须定义一个模板
您可以考虑创建模板
Is there a way to build a DataTemplate with only C#