PowerShell-WPF - 基于值的单元格的Datagrid背景颜色

时间:2017-06-19 14:40:30

标签: wpf powershell

我正在使用基于Powershell的WPF工具来获取来自多个服务器的磁盘信息,我需要将背景颜色设置为特定单元格,如果磁盘的可用空间少于10%,则Percentfree列为RED,如果为10-15%的可用空间。经过一对夫妇的博客/文章,不知何故,我设法获得预期的结果,除了仍然努力为多个值或值范围设置背景颜色。

任何帮助都将不胜感激。谢谢..!

    <DataGrid Name="diskstatus" HorizontalAlignment="Left" Margin="24,65,0,10" Width="739" GridLinesVisibility="None" AlternatingRowBackground="Lightgray" AlternationCount="2">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Server Name" Binding="{Binding ServerName}" Width="130"/>
            <DataGridTextColumn Header="Csize (GB)" Binding="{Binding Csize}" Width="100"/>
            <DataGridTextColumn Header="Cfree (GB)" Binding="{Binding Cfree}" Width="100"/>
            <DataGridTextColumn Header="CPercentfree" Binding="{Binding CPercentfree}" Width="100">
              <DataGridTextColumn.ElementStyle>
                 <Style TargetType="{x:Type TextBlock}">
                     <Style.Triggers>
                       <Trigger Property="Text" Value="5">
                       <Setter Property="Background" Value="Red"/>
                       </Trigger>
                    </Style.Triggers>
                    </Style>
           </DataGridTextColumn.ElementStyle>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Dsize (GB)" Binding="{Binding Dsize}" Width="100"/>
            <DataGridTextColumn Header="Dfree (GB)" Binding="{Binding Dfree}" Width="100"/>
            <DataGridTextColumn Header="DPercentfree" Binding="{Binding DPercentfree}" Width="100"/>
        </DataGrid.Columns>
    </DataGrid>

Powershell函数获取磁盘信息:

Function Getdiskinfo()
{
 $dsk=@()
 $importcsv= Import-Csv -Path $TPAcsvfile
 $Getservers = $importcsv.servername
 foreach ($CompName in $Getservers)
 {

$cdrivespace= Get-WMIObject Win32_logicaldisk -ComputerName $CompName |  ?{$_.DeviceID -eq 'C:'} | Select @{Name=‘cTotalSize’;Expression={[int]($_.Size / 1gb)}},`
@{Name=‘cFreeSpace’;Expression={[int]($_.FreeSpace / 1gb)}}, @{Name=‘cPercentFree’;Expression={[math]::Round($_.FreeSpace / $_.Size,2)*100}}


$ddrivespace= Get-WMIObject Win32_logicaldisk -ComputerName $CompName |  ?{$_.DeviceID -eq 'D:'} | Select @{Name=‘dTotalSize’;Expression={[int]($_.Size / 1gb)}},`
@{Name=‘dFreeSpace’;Expression={[int]($_.FreeSpace / 1gb)}}, @{Name=‘dPercentFree’;Expression={[math]::Round($_.FreeSpace / $_.Size,2)*100}}


     $diskinfo = New-Object psobject
     Add-Member -InputObject $diskinfo -membertype noteproperty -name "ServerName" -value $CompName
     Add-Member -InputObject $diskinfo -membertype noteproperty -name "cSize" -value $cdrivespace.cTotalSize
     Add-Member -InputObject $diskinfo -membertype noteproperty -name "cFree" -value $cdrivespace.cFreeSpace
     Add-Member -InputObject $diskinfo -membertype noteproperty -name "cPercentfree" -value $cdrivespace.cPercentFree
     Add-Member -InputObject $diskinfo -membertype noteproperty -name "DSize" -value $ddrivespace.dTotalSize
     Add-Member -InputObject $diskinfo -membertype noteproperty -name "DFree" -value $ddrivespace.dFreeSpace
     Add-Member -InputObject $diskinfo -membertype noteproperty -name "DPercentfree" -value $ddrivespace.dPercentFree
     $diskstatus.addchild($diskinfo) 
     $dsk +=$diskinfo

 } Return, $dsk
}

1 个答案:

答案 0 :(得分:0)

我不知道Powershell-WPF的限制,但基本上,您应该创建一个从CPercentfree转换为聚合范围标识符的转换器。

例如,让我们使用具有以下翻译的转换器:

CPercentfree > 15:
    Result = 0
CPercentfree >= 10:
    Result = 1
Otherwise (lower than 10)
    Result = 2

在C#中转换器看起来类似于以下内容,我希望你能为自己翻译它:

public class WarningLevelConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int v = value as Nullable<int> ?? System.Convert.ToInt32(value);
        if (v > 15)
        {
            return 0;
        }
        if (v >= 10)
        {
            return 1;
        }
        return 2;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

然后在资源的某处创建转换器(假设local是项目命名空间的xmlns

<local:WarningLevelConverter x:Key="cWarningLevel"/>

并将其与一些数据触发器一起使用:

<DataGridTextColumn Header="CPercentfree" Binding="{Binding CPercentfree}" Width="100">
    <DataGridTextColumn.ElementStyle>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding CPercentfree,Converter={StaticResource cWarningLevel}}" Value="1">
                    <Setter Property="Background" Value="Orange"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding CPercentfree,Converter={StaticResource cWarningLevel}}" Value="2">
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </DataGridTextColumn.ElementStyle>

注意我对<DataTrigger Binding="{Binding CPercentfree,Converter={StaticResource cWarningLevel}}"部分的DataContext不是100%肯定。您最终可能需要将其更改为<DataTrigger Binding="{Binding Converter={StaticResource cWarningLevel}}"