Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态更改Wpf DatagridTemplateColumn的边框笔刷颜色_C#_Wpf_Imultivalueconverter - Fatal编程技术网

C# 动态更改Wpf DatagridTemplateColumn的边框笔刷颜色

C# 动态更改Wpf DatagridTemplateColumn的边框笔刷颜色,c#,wpf,imultivalueconverter,C#,Wpf,Imultivalueconverter,在我的wpf项目中,我制作了一个IMultiValueConverter,它将改变DataGridCells的前景,如下所示: class CellForegroundMultiValueConverter : IMultiValueConverter { #region Implementation of IMultiValueConverter /// <inheritdoc /> public object Convert(object[] value

在我的wpf项目中,我制作了一个
IMultiValueConverter
,它将改变DataGridCells的前景,如下所示:

class CellForegroundMultiValueConverter : IMultiValueConverter
{
    #region Implementation of IMultiValueConverter

    /// <inheritdoc />
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush mainred = new SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
        var columnHeader = values[0] as string;
        var dataItem = values[1] as Task;
        if( columnHeader.Equals("Status", StringComparison.OrdinalIgnoreCase)
               && dataItem.Status.Equals("Success!", StringComparison.OrdinalIgnoreCase))
        {
            return mainred;
        }
        if( columnHeader.Equals("#", StringComparison.OrdinalIgnoreCase))
        {
            return mainred;
        }
        if( columnHeader.Equals("Proxy"))
        {
            if(dataItem.Proxy)
            {
                return Brushes.LightGreen;
            }
            return mainred;
        }


        return Brushes.White;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotSupportedException();

    #endregion
}
<DataGrid.CellStyle>
                             <Style TargetType="{x:Type DataGridCell}">
                                    ...
                                    <Setter Property="Foreground">
                                        <Setter.Value>
                                            <MultiBinding>
                                                <MultiBinding.Converter>
                                                    <local:CellForegroundMultiValueConverter />
                                                </MultiBinding.Converter>

                                                <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
                                                <Binding/>
                                                <Binding Path="HasChanges" />
                                            </MultiBinding>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGrid.CellStyle>
<DataGridTemplateColumn Width="*" Header="#" MaxWidth="60">
                                    <DataGridTemplateColumn.HeaderStyle>
                                        <Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="{x:Type DataGridColumnHeader}">
                                            <Setter Property="HorizontalAlignment" Value="Left" />
                                        </Style>
                                    </DataGridTemplateColumn.HeaderStyle>
                                    <DataGridTemplateColumn.CellStyle>
                                        <Style TargetType="{x:Type DataGridCell}">
                                            <Setter Property="Padding" Value="20"/>
                                            <!--<Setter Property="Height" Value="57"/>-->
                                            <Setter Property="BorderBrush">
                                                <Setter.Value>
                                                    <MultiBinding>
                                                        <MultiBinding.Converter>
                                                            <local:CellForegroundMultiValueConverter />
                                                        </MultiBinding.Converter>

                                                        <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
                                                        <Binding/>
                                                        <Binding Path="HasChanges" />
                                                    </MultiBinding>
                                                </Setter.Value>
                                            </Setter>
                                        </Style>
                                    </DataGridTemplateColumn.CellStyle>
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Border Background="#262626" CornerRadius="5,5,5,5" BorderThickness="2" BorderBrush="{Binding StatusColour}">
                                                <Border.Style>
                                                    <Style TargetType="Border">

                                                    </Style>
                                                </Border.Style>
                                                <TextBlock Text="{Binding NumberOTasks}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="#E43D47"/>
                                            </Border>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>
class CellForeGround多值转换器:IMultiValueConverter
{
#IMultiValueConverter的区域实现
/// 
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
SolidColorBrush mainred=新的SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
var columnHeader=值[0]作为字符串;
var dataItem=作为任务的值[1];
if(columnHeader.Equals(“Status”,StringComparison.OrdinalIgnoreCase)
&&dataItem.Status.Equals(“Success!”,StringComparison.OrdinalIgnoreCase))
{
返回mainred;
}
if(columnHeader.Equals(“#”,StringComparison.OrdinalIgnoreCase))
{
返回mainred;
}
if(columnHeader.Equals(“代理”))
{
if(dataItem.Proxy)
{
返回笔刷。浅绿色;
}
返回mainred;
}
返回刷。白色;
}
公共对象[]ConvertBack(对象值,类型[]targetTypes,对象参数,CultureInfo区域性)=>抛出新的NotSupportedException();
#端区
}
它链接到我的DataGrid,如下所示:

class CellForegroundMultiValueConverter : IMultiValueConverter
{
    #region Implementation of IMultiValueConverter

    /// <inheritdoc />
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush mainred = new SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
        var columnHeader = values[0] as string;
        var dataItem = values[1] as Task;
        if( columnHeader.Equals("Status", StringComparison.OrdinalIgnoreCase)
               && dataItem.Status.Equals("Success!", StringComparison.OrdinalIgnoreCase))
        {
            return mainred;
        }
        if( columnHeader.Equals("#", StringComparison.OrdinalIgnoreCase))
        {
            return mainred;
        }
        if( columnHeader.Equals("Proxy"))
        {
            if(dataItem.Proxy)
            {
                return Brushes.LightGreen;
            }
            return mainred;
        }


        return Brushes.White;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotSupportedException();

    #endregion
}
<DataGrid.CellStyle>
                             <Style TargetType="{x:Type DataGridCell}">
                                    ...
                                    <Setter Property="Foreground">
                                        <Setter.Value>
                                            <MultiBinding>
                                                <MultiBinding.Converter>
                                                    <local:CellForegroundMultiValueConverter />
                                                </MultiBinding.Converter>

                                                <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
                                                <Binding/>
                                                <Binding Path="HasChanges" />
                                            </MultiBinding>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGrid.CellStyle>
<DataGridTemplateColumn Width="*" Header="#" MaxWidth="60">
                                    <DataGridTemplateColumn.HeaderStyle>
                                        <Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="{x:Type DataGridColumnHeader}">
                                            <Setter Property="HorizontalAlignment" Value="Left" />
                                        </Style>
                                    </DataGridTemplateColumn.HeaderStyle>
                                    <DataGridTemplateColumn.CellStyle>
                                        <Style TargetType="{x:Type DataGridCell}">
                                            <Setter Property="Padding" Value="20"/>
                                            <!--<Setter Property="Height" Value="57"/>-->
                                            <Setter Property="BorderBrush">
                                                <Setter.Value>
                                                    <MultiBinding>
                                                        <MultiBinding.Converter>
                                                            <local:CellForegroundMultiValueConverter />
                                                        </MultiBinding.Converter>

                                                        <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
                                                        <Binding/>
                                                        <Binding Path="HasChanges" />
                                                    </MultiBinding>
                                                </Setter.Value>
                                            </Setter>
                                        </Style>
                                    </DataGridTemplateColumn.CellStyle>
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Border Background="#262626" CornerRadius="5,5,5,5" BorderThickness="2" BorderBrush="{Binding StatusColour}">
                                                <Border.Style>
                                                    <Style TargetType="Border">

                                                    </Style>
                                                </Border.Style>
                                                <TextBlock Text="{Binding NumberOTasks}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="#E43D47"/>
                                            </Border>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>

...
我有一个DataGridTemplate列,显示DataGrid中的项目数,如下所示:

class CellForegroundMultiValueConverter : IMultiValueConverter
{
    #region Implementation of IMultiValueConverter

    /// <inheritdoc />
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        SolidColorBrush mainred = new SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
        var columnHeader = values[0] as string;
        var dataItem = values[1] as Task;
        if( columnHeader.Equals("Status", StringComparison.OrdinalIgnoreCase)
               && dataItem.Status.Equals("Success!", StringComparison.OrdinalIgnoreCase))
        {
            return mainred;
        }
        if( columnHeader.Equals("#", StringComparison.OrdinalIgnoreCase))
        {
            return mainred;
        }
        if( columnHeader.Equals("Proxy"))
        {
            if(dataItem.Proxy)
            {
                return Brushes.LightGreen;
            }
            return mainred;
        }


        return Brushes.White;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotSupportedException();

    #endregion
}
<DataGrid.CellStyle>
                             <Style TargetType="{x:Type DataGridCell}">
                                    ...
                                    <Setter Property="Foreground">
                                        <Setter.Value>
                                            <MultiBinding>
                                                <MultiBinding.Converter>
                                                    <local:CellForegroundMultiValueConverter />
                                                </MultiBinding.Converter>

                                                <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
                                                <Binding/>
                                                <Binding Path="HasChanges" />
                                            </MultiBinding>
                                        </Setter.Value>
                                    </Setter>
                                </Style>
                            </DataGrid.CellStyle>
<DataGridTemplateColumn Width="*" Header="#" MaxWidth="60">
                                    <DataGridTemplateColumn.HeaderStyle>
                                        <Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="{x:Type DataGridColumnHeader}">
                                            <Setter Property="HorizontalAlignment" Value="Left" />
                                        </Style>
                                    </DataGridTemplateColumn.HeaderStyle>
                                    <DataGridTemplateColumn.CellStyle>
                                        <Style TargetType="{x:Type DataGridCell}">
                                            <Setter Property="Padding" Value="20"/>
                                            <!--<Setter Property="Height" Value="57"/>-->
                                            <Setter Property="BorderBrush">
                                                <Setter.Value>
                                                    <MultiBinding>
                                                        <MultiBinding.Converter>
                                                            <local:CellForegroundMultiValueConverter />
                                                        </MultiBinding.Converter>

                                                        <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
                                                        <Binding/>
                                                        <Binding Path="HasChanges" />
                                                    </MultiBinding>
                                                </Setter.Value>
                                            </Setter>
                                        </Style>
                                    </DataGridTemplateColumn.CellStyle>
                                    <DataGridTemplateColumn.CellTemplate>
                                        <DataTemplate>
                                            <Border Background="#262626" CornerRadius="5,5,5,5" BorderThickness="2" BorderBrush="{Binding StatusColour}">
                                                <Border.Style>
                                                    <Style TargetType="Border">

                                                    </Style>
                                                </Border.Style>
                                                <TextBlock Text="{Binding NumberOTasks}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="#E43D47"/>
                                            </Border>
                                        </DataTemplate>
                                    </DataGridTemplateColumn.CellTemplate>
                                </DataGridTemplateColumn>


如果我将
IMultiValueConverter
放在
DataGridTemplateColumn.CellStyle
中,它会工作并为边框添加颜色,但它不受边框的拐角半径的影响,但如果我将其放在边框样式中,它将不工作,并显示列标题为=null。如何更改边界笔刷,使其受边界角半径的影响?

您可以为每列设置单元格样式,或基于值使用全局单元格样式:

<DataGrid xmlns:system="clr-namespace:System;assembly=mscorlib">
  <DataGrid.Resources>
   <Style TargetType="DataGridCell">
    <Style.Triggers>
     <DataTrigger Binding="{Binding}"
                  Value="Proxy">
      <Setter Property="Foreground"
              Value="LightGreen" />
      <Setter Property="BorderBrush"
              Value="LightGreen" />
     </DataTrigger>
     <DataTrigger Binding="{Binding}"
                  Value="#">
      <Setter Property="Foreground"
              Value="Gray" />
      <Setter Property="BorderBrush"
              Value="Red" />
     </DataTrigger>
    </Style.Triggers>
   </Style>
  </DataGrid.Resources>
  <DataGrid.Columns>
   <DataGridTextColumn Binding="{Binding}"
                       Header="#" />
   <DataGridTextColumn Binding="{Binding}"
                       Header="Proxy" />
   <DataGridTextColumn  Binding="{Binding}"
                        Header="Status">
    <DataGridTextColumn.CellStyle>
     <Style TargetType="DataGridCell">
      <Setter  Property="Foreground"
               Value="Blue" />
      <Setter  Property="BorderBrush"
               Value="Blue" />
     </Style>
    </DataGridTextColumn.CellStyle>
   </DataGridTextColumn>
  </DataGrid.Columns>
  <system:String>Proxy</system:String>
  <system:String>#</system:String>
  <system:String>Success</system:String>
 </DataGrid> 

代理
#
成功
结果应该如下所示:

要更改内部网格边框,您需要覆盖
DataGridCell
的默认模板,并从中修改边框属性。请记住,有两个模板用于
ContentControl
:一个
ControlTemplate
用于
ContentControl
本身(例如
ListBoxItem
DataGridCell
),另一个
DataTemplate
用于
ContentControl
的内容

<DataGridTemplateColumn.CellStyle>
  <Style TargetType="DataGridCell">
    <Setter Property="Background" Value="#262626">
    <Setter Property="BorderBrush">
      <Setter.Value>
        <MultiBinding>
          <MultiBinding.Converter>
            <local:CellForegroundMultiValueConverter />
          </MultiBinding.Converter>

          <Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
          <Binding/>
          <Binding Path="HasChanges" />
        </MultiBinding>
      </Setter.Value>
    </Setter>

    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="DataGridCell">
          <Border BorderThickness="{TemplateBinding BorderThickness}"
                  BorderBrush="{TemplateBinding BorderBrush}" 
                  Background="{TemplateBinding Background}" 
                  CornerRadius="5">
            <ContentPresenter />
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</DataGridTemplateColumn.CellStyle>

要更改
数据网格的内部网格单元格边框还是单元格内容的边框