Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# 更改DataGridCell与其内容相关的背景_C#_Wpf_Datagrid_Background_Datagridcell - Fatal编程技术网

C# 更改DataGridCell与其内容相关的背景

C# 更改DataGridCell与其内容相关的背景,c#,wpf,datagrid,background,datagridcell,C#,Wpf,Datagrid,Background,Datagridcell,我知道我的问题已经在这里以几种方式陈述和回答了。但我就是不能让它按我想要的方式运行。 正如标题所述,我试图根据datagridcell的内容更改其背景色。 我对WPF比较陌生,但我想解决方案是一个结合了绑定的转换器。 目标是根据名为“Status”的属性更改单元格的背景颜色,该属性是一个具有四个状态的枚举 我已经写了一个转换器: using System; using System.Windows.Data; using System.Drawing; using System.Windows;

我知道我的问题已经在这里以几种方式陈述和回答了。但我就是不能让它按我想要的方式运行。 正如标题所述,我试图根据datagridcell的内容更改其背景色。 我对WPF比较陌生,但我想解决方案是一个结合了绑定的转换器。 目标是根据名为“Status”的属性更改单元格的背景颜色,该属性是一个具有四个状态的枚举

我已经写了一个转换器:

using System;
using System.Windows.Data;
using System.Drawing;
using System.Windows;

namespace Admin
{
    [ValueConversion(typeof(Member.UserStatus), typeof(Brushes))]
    public class StatusToColorConverter : IValueConverter
    {
        #region IValueConverter Member

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            var enumValue = (Member.UserStatus)value;

            if(enumValue == Member.UserStatus.Change)
                return Brushes.Red;
            if(enumValue == Member.UserStatus.Import)
                return Brushes.Blue;
            if(enumValue == Member.UserStatus.Remove)
                return Brushes.Orange;
            if(enumValue == Member.UserStatus.Synced)
                return Brushes.Green;
            else
                return DependencyProperty.UnsetValue;
        }

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

        #endregion
    }
}
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        var enumValue = (Member.UserStatus)((DataRow)value)["Status"];
        if(enumValue == Member.UserStatus.Change)
            return Brushes.Red;
        if(enumValue == Member.UserStatus.Import)
            return Brushes.Blue;
        if(enumValue == Member.UserStatus.Remove)
            return Brushes.Orange;
        if(enumValue == Member.UserStatus.Synced)
            return Brushes.Green;
        else
            return DependencyProperty.UnsetValue;
    }
到目前为止还不错。 xaml部分看起来是这样的(在一些谷歌搜索之后…)


我还不知道DataGridTemplateColums和DataTemplates是什么。但我尝试了同样的CellStyle和另一种我不记得的方式。 转换器有一个断点,在我尝试的所有解决方案中都会被调用。但不知何故,“Background”属性似乎忽略了转换器的返回值。所以我想我的错误(或我缺乏理解)还有另一个原因

有人愿意为我指出正确的方向吗?

我是这样做的:

              <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="Background">
                            <Setter.Value>
                                <Binding Path="Row" Mode="OneWay" />
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.CellStyle>
我是这样做的:

              <DataGrid.CellStyle>
                    <Style TargetType="DataGridCell">
                        <Setter Property="Background">
                            <Setter.Value>
                                <Binding Path="Row" Mode="OneWay" />
                            </Setter.Value>
                        </Setter>
                    </Style>
                </DataGrid.CellStyle>

如果我正确解释了XAML,那么您正在绘制列标题(“最顶部”单元格),而不是单元格本身

这对我很有用:

<DataGrid.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Background" Value="{Binding Status},
                       Converter={StaticResource StatusToColorConverter}">
                    </Setter>
                </Style>
</DataGrid.CellStyle>

这应该是你的手机

作为旁注:如果您正在绘制单元格的背景,您的单元格可能看起来“怪异”——我的单元格经常会丢失边框等。一个简单快捷的解决方法是添加以下属性设置器(这是默认的wpf样式)


如果我正确解释了您的XAML,那么您正在绘制列标题(“最顶端”单元格),而不是单元格本身

这对我很有用:

<DataGrid.CellStyle>
                <Style TargetType="{x:Type DataGridCell}">
                    <Setter Property="Background" Value="{Binding Status},
                       Converter={StaticResource StatusToColorConverter}">
                    </Setter>
                </Style>
</DataGrid.CellStyle>

这应该是你的手机

作为旁注:如果您正在绘制单元格的背景,您的单元格可能看起来“怪异”——我的单元格经常会丢失边框等。一个简单快捷的解决方法是添加以下属性设置器(这是默认的wpf样式)


好的,伙计们。我现在把问题解决了。 问题不是我的xaml代码。转换器也工作得很好。问题在于converter.cs文件中的以下行:

    using System.Drawing;
我用正确的替换了它:

    using System.Windows.Media;
现在它就像一个符咒。 ... 我正在传递WinForms的画笔,而不是WPF画笔


无论如何,谢谢你的帮助:)

好的,伙计们。我现在把问题解决了。 问题不是我的xaml代码。转换器也工作得很好。问题在于converter.cs文件中的以下行:

    using System.Drawing;
我用正确的替换了它:

    using System.Windows.Media;
现在它就像一个符咒。 ... 我正在传递WinForms的画笔,而不是WPF画笔


无论如何,感谢您的帮助:)

您当前的解决方案是做什么的,它是选择整行的吗?您是否尝试过为datargid设置SelectionUnit=“Cell”并设置DataGridCell的样式?设置单元格的样式是我尝试过的解决方案之一(至少我认为是这样),结果相同:调用了Converter,但后台属性忽略了该值。你能给我发一个这样的DataGridCell样式在XAML中是什么样子的例子吗?试试两件事:1-绑定能工作吗?尝试转换器中的断点,查看“enumValue”是否获得所需的值。2-在调试模式下运行时,查看输出窗口以查看任何相关消息。@Naser Asadi:是。绑定的工作方式至少是转换器获取并返回正确的值。似乎背景属性忽略了返回的笔刷。有关输出窗口的提示。我经常忘记那件事。但它不会显示任何错误消息。您当前的解决方案所做的是选择整行吗?您是否尝试过为datargid设置SelectionUnit=“Cell”并设置DataGridCell的样式?设置单元格的样式是我尝试过的解决方案之一(至少我认为是这样),结果相同:调用了Converter,但后台属性忽略了该值。你能给我发一个这样的DataGridCell样式在XAML中是什么样子的例子吗?试试两件事:1-绑定能工作吗?尝试转换器中的断点,查看“enumValue”是否获得所需的值。2-在调试模式下运行时,查看输出窗口以查看任何相关消息。@Naser Asadi:是。绑定的工作方式至少是转换器获取并返回正确的值。似乎背景属性忽略了返回的笔刷。有关输出窗口的提示。我经常忘记那件事。但是它不会显示任何错误消息。在这个解决方案中,我在哪里实现转换器?XAML语法仍然让我感到困惑。@Mathew那么您是如何在您的案例中实现它的呢?同样的方法。在这个解决方案中,我在哪里实现转换器?XAML语法仍然让我感到困惑。@Mathew那么您是如何在您的案例中实现它的呢?我只是重读了你的代码:你想只画STATUS列,而不画其他列吗?如果是这样的话,你需要一个多重绑定——我有它的代码,所以如果你需要就说吧。你的意思是:``?也不起作用。我想单独绘制“状态”列中有关其内容的单元格。很抱歉出现“它不起作用”。转换器被调用,具有正确的值,它甚至返回正确的画笔。。。但还是一样:画笔似乎被忽略了。我只是重新阅读了你的代码:你想只画STATUS列,而不画其他列吗?如果是这样的话,你需要一个多重绑定——我有它的代码,所以如果你需要就说吧。你的意思是:``?也不起作用。我想单独绘制“状态”列中有关其内容的单元格。很抱歉出现“它不起作用”。好的