【问题标题】:WPF: Trigger property from a nested child templateWPF:来自嵌套子模板的触发器属性
【发布时间】:2017-03-18 14:55:33
【问题描述】:

我有一个数据网格,它的一列中有一个嵌套的数据网格。我需要从子datagid中的行数触发主datagrid行背景颜色。

这是一个简化的例子。

XAML

<Grid>
    <DataGrid x:Name="dataGrid1" ItemsSource="{Binding rigList}"  AutoGenerateColumns="False" CanUserAddRows="false">
        <DataGrid.Resources>
            <Style TargetType="DataGridRow">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Items.Count, ElementName=dataGridInner}" Value="2">
                        <Setter Property="Background" Value="LightBlue"></Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Items.Count, ElementName=dataGridInner}" Value="1">
                        <Setter Property="Background" Value="LightGreen"></Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="Description" Binding="{Binding Description}" Width="*"/>
            <DataGridTemplateColumn Header="Item/Price" Width="220">
                <DataGridTemplateColumn.CellTemplate >
                    <DataTemplate>
                        <DataGrid x:Name="dataGridInner" ItemsSource="{Binding Items}" HeadersVisibility="None" AutoGenerateColumns="False" CanUserAddRows="false" >
                            <DataGrid.Columns>
                                <DataGridTextColumn Binding="{Binding Name}" Width="*"/>
                                <DataGridTextColumn Binding="{Binding Price}" Width="*"/>
                            </DataGrid.Columns>
                        </DataGrid>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

C#

public class Item
{
    public string Name { get; set; }
    public int Price { get; set; }
}
public class DataTable
{
    public List<Item> Items { get; set; }
    public string Description { get; set; }
}

public partial class MainWindow : Window
{
    public ObservableCollection<DataTable> itemList { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        itemList = new ObservableCollection<DataTable>
        {
            new DataTable() {
                Items = new List<Item> {
                    new Item { Name = "Phone", Price = 220 },
                    new Item { Name = "Tablet", Price = 350 },
                },
                Description = "Electronic gadgets" },
            new DataTable() {
                Items = new List<Item> {
                    new Item { Name = "Teddy Bear", Price = 2200 },
                },
            Description = "Exclusive teddy bear" }
        };
        dataGrid1.ItemsSource = itemList;
    }
}

Here's the picture of the table this code yields.

因此,通过将触发器放入数据网格的资源中,我至少可以使用 ElementName 访问子数据网格模板。但是 setter 显然只在孩子的范围内应用 Background 属性。我需要的是,如果子数据网格有两行,则整个父行将是蓝色的。

如何实现?

【问题讨论】:

  • 我认为你不需要 , ElementName=dataGridInner 绑定的一部分。 Items 是行 DataContext 的属性。而不是将样式放在&lt;DataGrid.Resources&gt; 中为dataGrid1 设置&lt;DataGrid.RowStyle&gt;

标签: wpf templates binding triggers nested


【解决方案1】:

首先,将样式设置为父 Grid 的 RowStyle。这就是您要设置背景颜色的地方。您不需要将此样式应用于子项,这就是您通过在 Resources 中将其创建为该网格或其任何子项中 DataGrid 行的 all 实例的隐式样式来执行的操作控件(这就是它在子网格上工作的原因)。

其次,您将绑定到父网格行视图模型的属性Items.Count。因此,无需涉及子网格控件。直接转到填充它的集合。

第三,一旦你让行工作,你会注意到子网格有一个白色的背景。事实上,网格和其中的行具有白色背景。我在子网格的 RowStyle 属性和子网格本身上添加了一个透明背景的修复程序。

<DataGrid x:Name="dataGrid1" ItemsSource="{Binding rigList}"  AutoGenerateColumns="False" CanUserAddRows="false">
    <DataGrid.RowStyle>
        <Style TargetType="DataGridRow">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Items.Count}" Value="2">
                    <Setter Property="Background" Value="LightBlue"></Setter>
                </DataTrigger>
                <DataTrigger Binding="{Binding Items.Count}" Value="1">
                    <Setter Property="Background" Value="LightGreen"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGrid.RowStyle>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Description" Binding="{Binding Description}" Width="*"/>
        <DataGridTemplateColumn Header="Item/Price" Width="220">
            <DataGridTemplateColumn.CellTemplate >
                <DataTemplate>
                    <DataGrid 
                        Background="Transparent"
                        x:Name="dataGridInner" 
                        ItemsSource="{Binding Items}" 
                        HeadersVisibility="None" 
                        AutoGenerateColumns="False" 
                        CanUserAddRows="false" 
                        >
                        <DataGrid.RowStyle>
                            <Style TargetType="DataGridRow">
                                <Setter Property="Background" Value="Transparent" />
                            </Style>
                        </DataGrid.RowStyle>
                        <DataGrid.Columns>
                            <DataGridTextColumn Binding="{Binding Name}" Width="*" />
                            <DataGridTextColumn Binding="{Binding Price}" Width="*"/>
                        </DataGrid.Columns>
                    </DataGrid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-16
    • 2018-09-15
    • 1970-01-01
    • 2016-01-13
    • 2011-08-19
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多