Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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 DataGrid基于规则的多列颜色_C#_Wpf_Gridview - Fatal编程技术网

C# WPF DataGrid基于规则的多列颜色

C# WPF DataGrid基于规则的多列颜色,c#,wpf,gridview,C#,Wpf,Gridview,我开始开发一个WPF应用程序,现在我集成了一个带有一些十进制值的DataGrid。这些价值如息税前利润、净资产收益率等 现在我想知道,如果息税前利润超过12,如何给单元格着色,如果净资产收益率低于20,如何给单元格着色 当我使用网格开发ASP.NET时,我有OnRowDataBound事件来完成这些工作 有什么想法吗 致以最良好的祝愿, Rayk您应该使用转换器来执行此操作() 例如: 颜色转换器转换器: class ColorConverter : IValueConverter {

我开始开发一个WPF应用程序,现在我集成了一个带有一些十进制值的DataGrid。这些价值如息税前利润、净资产收益率等

现在我想知道,如果息税前利润超过12,如何给单元格着色,如果净资产收益率低于20,如何给单元格着色

当我使用网格开发ASP.NET时,我有OnRowDataBound事件来完成这些工作

有什么想法吗

致以最良好的祝愿,
Rayk

您应该使用转换器来执行此操作()

例如:

颜色转换器
转换器:

class ColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value != null && parameter != null)
        {
            double? dValue = value as double?;
            if (!dValue.HasValue) return Binding.DoNothing;

            var items = parameter.ToString().Split(' ');
            if(items.Length == 2)
            {
                double cValue;
                if(!double.TryParse(items[1], out cValue))
                    return Binding.DoNothing;

                switch (items[0])
                {
                    case "<":
                        if (dValue.Value < cValue)
                            return new SolidColorBrush(Colors.Red);
                        break;
                    case ">":
                        if (dValue.Value > cValue)
                            return new SolidColorBrush(Colors.Red);
                        break;
                    default:
                        break;
                }
            }
        }
        return Binding.DoNothing;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
解决方案2:

数据类:

class Data : INotifyPropertyChanged
{
    private double _RoE;
    public double RoE
    {
        get { return _RoE; }
        set 
        { 
            _RoE = value;
            if (value < 10)
                RoEColor = new SolidColorBrush(Colors.Red);
            else if (value > 20)
                RoEColor = new SolidColorBrush(Colors.Green);
            else
                RoEColor = new SolidColorBrush(Colors.White);
            OnPropertyChanged("RoE");
        }
    }

    private SolidColorBrush _RoEColor;
    public SolidColorBrush RoEColor
    {
        get { return _RoEColor; }
        set { _RoEColor = value; OnPropertyChanged("RoEColor"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }
}

很不错的!converter参数是关键。但是如果我有三个范围,小于2的是红色,大于12的是绿色。在白色之间。我是否应该扩展ConverterParameter?是的,您应该扩展ConverterParameter(代码):)嗯,是否可以从绑定对象传递另一个属性值。e、 罗埃科。。。这里我关心的是,我不想将验证逻辑保留在转换器类中。也许我可以将结果传递给参数?@Rayk再次检查我的答案(解决方案2):)是的,这就是我要搜索的。谢谢
class Data : INotifyPropertyChanged
{
    private double _RoE;
    public double RoE
    {
        get { return _RoE; }
        set 
        { 
            _RoE = value;
            if (value < 10)
                RoEColor = new SolidColorBrush(Colors.Red);
            else if (value > 20)
                RoEColor = new SolidColorBrush(Colors.Green);
            else
                RoEColor = new SolidColorBrush(Colors.White);
            OnPropertyChanged("RoE");
        }
    }

    private SolidColorBrush _RoEColor;
    public SolidColorBrush RoEColor
    {
        get { return _RoEColor; }
        set { _RoEColor = value; OnPropertyChanged("RoEColor"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }
}
<DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False">
    <DataGrid.Columns>               
        <DataGridTextColumn Binding="{Binding RoE}">
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Background" Value="{Binding RoEColor}"/>
                </Style>
            </DataGridTextColumn.ElementStyle>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>