Wpf 如何使用Powershell在XAML数据网格中设置列的样式属性?

Wpf 如何使用Powershell在XAML数据网格中设置列的样式属性?,wpf,xaml,powershell,Wpf,Xaml,Powershell,我正在使用Powershell和XAML构建WPF UI。我遇到的一个问题是设置列的样式。我可以在XAML中设置样式,但是有9列(3个数据网格中各有3列),因此我觉得在代码中设置属性比在同一块中重复9次更整洁 以下是我如何通过XAML在单个列上设置样式: <DataGridTextColumn Header="Attribute" Binding="{Binding Attribute}"> <DataGridTextColumn.ElementStyle>

我正在使用Powershell和XAML构建WPF UI。我遇到的一个问题是设置列的样式。我可以在XAML中设置样式,但是有9列(3个数据网格中各有3列),因此我觉得在代码中设置属性比在同一块中重复9次更整洁

以下是我如何通过XAML在单个列上设置样式:

<DataGridTextColumn Header="Attribute" Binding="{Binding Attribute}">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <Trigger Property="Text" Value="">
                    <Setter Property="Background" Value="LightGreen"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
但是,如果我尝试通过Powershell添加样式,我会遇到依赖属性。我尝试通过在XAML中创建样式,然后尝试在Powershell中对其进行反向工程来检查它们,这是我迄今为止所做的工作:

$dataGridUser.Columns[0]。ElementStyle的类型为System.Windows.Style $dataGridUser.Columns[0]。ElementStyle.Triggers的类型为System.Windows.Trigger $dataGridUser.Columns[0]。ElementStyle.Triggers.Property的类型为Selected.System.Windows.Trigger $dataGridUser.Columns[0]。ElementStyle.Triggers.Property.Property的类型为System.Windows.DependencyProperty

我无法创建System.Windows.DependencyProperty类型的对象,该对象应包含文本的Name属性。到目前为止,我管理的最好方法是通过XAML创建一列,然后像下面这样提取依赖项属性对象:

$objDepend = $($dataGridUser.Columns[0].ElementStyle.Triggers | Select Property).Property
$objSelect = $(New-Object System.Windows.Trigger | Select Property)
$objSelect.Property = $objDepend
$objTrigger = New-Object System.Windows.Trigger 
$objTrigger.Value = ""
$objTrigger.Property = $objSelect.Property
$objStyle = New-Object System.Windows.Style
$objStyle.Triggers.Add($objTrigger)
$colAttribute = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Attribute"; "Binding" = New-Object System.Windows.Data.Binding "Attribute"; "ElementStyle" = $objStyle}
使用此对象,我可以创建一个具有正确触发器属性的新列对象(我知道它仍然缺少“Setter”属性,但我认为同样的原则也适用),如下所示:

$objDepend = $($dataGridUser.Columns[0].ElementStyle.Triggers | Select Property).Property
$objSelect = $(New-Object System.Windows.Trigger | Select Property)
$objSelect.Property = $objDepend
$objTrigger = New-Object System.Windows.Trigger 
$objTrigger.Value = ""
$objTrigger.Property = $objSelect.Property
$objStyle = New-Object System.Windows.Style
$objStyle.Triggers.Add($objTrigger)
$colAttribute = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Attribute"; "Binding" = New-Object System.Windows.Data.Binding "Attribute"; "ElementStyle" = $objStyle}
这显然不是解决这个问题的正确方法,不过,我显然遗漏了一些东西,大概是关于依赖性属性,我怀疑这些属性是派生的,而不是简单地设置的


我希望所有这些都是有意义的,有人能帮忙吗?

我希望回答我自己(也是唯一)的问题是可以接受的,但我想我会分享我开发的解决方案,以防其他人处于类似的位置

只需编写一个函数来创建Windows.Style.Object并将其传回即可。我从两个默认字符串开始,如下所示:

$strXAMLStart = @"
<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <DataGrid x:Name="dataGridTrigger">
            <DataGrid.Columns>
                <DataGridTextColumn>
                    <DataGridTextColumn.ElementStyle>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>`n
"@

$strXAMLEnd = @"
                           </Style.Triggers>
                        </Style>
                    </DataGridTextColumn.ElementStyle>
                </DataGridTextColumn>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
"@
希望一切都有意义

$hashStyle = @{"Blank" = "#FFFF5050"; "0" = "#FF50FF50"; "267009" = "#FF50FF50"}
$objStyle = Set-ColumnStyle $hashStyle
$colDay = New-Object System.Windows.Controls.DataGridTextColumn -Property @{"Header" = "Day"; "Binding" = New-Object System.Windows.Data.Binding "Day"; "ElementStyle" = $objStyle}
$dataGridScripts.Columns.Add($colDay)