1

大家好,我正在使用 C# WPF 开发一个项目,我需要在列表视图中显示客户端的状态所以我有以下定义客户端状态的枚举

//Values used here for Bitwise Operations
public enum ClientStatus 
{
    NONE = 0,
    NEWCLIENT = 1, 
    MONITORED = 2, 
    IMPORTAND = 4,  
    DISATISFIED = 8, 
    DETERIORATING = 16, 
    SATISFIED = 32 
};

要将每个转换为特定的画笔,我有以下代码,经过测试并且可以正常工作

[ValueConversion(typeof(Enums.ClientStatus), typeof(Brush))]
public class StateValueColorConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Brush Brush = Brushes.Red;
        if (value is Enums.ClientStatus)
        {
            Enums.ClientStatus sv = (Enums.ClientStatus)value;

            switch (sv)
            {
                case Enums.ClientStatus.IMPORTAND:
                    Brush = Brushes.Blue;
                    break;
                case Enums.ClientStatus.MONITORED:
                    Brush = Brushes.Purple;
                    break;
                case Enums.ClientStatus.NEWCLIENT:
                    Brush = Brushes.Orange;
                    break;
                case Enums.ClientStatus.SATISFIED:
                    Brush = Brushes.Green;
                    break;
                case Enums.ClientStatus.DETERIORATING:
                    Brush = Brushes.Yellow;
                    break;
                case Enums.ClientStatus.DISATISFIED:
                    Brush = Brushes.Red;
                    break;
            }
        }
        return Brush;
    }

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

做绑定我做了以下,这不是我们的讲师真正想要的

<GridViewColumn Header="Status" Width="110">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                 <TextBox Width="50" Background="{Binding Path=Status, Converter={StaticResource ColorConverter}}"></TextBox>
                 <TextBox Width="50" Background="{Binding Path=SatisFactory, Converter={StaticResource ColorConverter}}"></TextBox>
            </StackPanel>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

我们需要将每个枚举显示为不同的颜色,但是客户端可以有多种状态,即

var status = ClientStatus.NEWCLIENT | ClientStatus.SATISFIED;

这现在将返回一个 int 值 33

我现在的问题是我在客户端中使用了两个属性来显示单独的状态,这是不正确的,我们需要使用按位运算,即。

if ((status & ClientStatus.NEWCLIENT) == ClientStatus.NEWCLIENT)
{
    //do whatever
}

所以我可以执行上面的代码,但是我将如何对一个属性进行绑定以在一个 gridviewcolumn 中显示多种颜色,我搜索了论坛,但如果有这个问题或类似的问题,我会错过它

我不确定如何陈述这个问题,所以我会换一种说法

我想在列中显示所有选定的枚举。

感谢您的任何帮助或建议希望我有意义

4

2 回答 2

0

如果我正确理解您的问题,您希望为枚举中的每个值显示一个图标、图像或 UI 元素,并在对象的状态与该值匹配时使它们可见。

我想我会创建一个包含所有 UI 元素的简单 StackPanel,如下所示:

<StackPanel Orientation="Horizontal">
  <Rectangle Fill="Blue" 
             Visibility="{Binding Status, 
                                  Converter={StaticResource StatusToVisibilityConverter},
                                  ConverterParameter=NEWCLIENT}" />
  <Rectangle Fill="Green" 
             Visibility="{Binding Status, 
                                  Converter={StaticResource StatusToVisibilityConverter},
                                  ConverterParameter=SATISFIED}" />
  ...
</StackPanel>

然后在您的 StatusToVisibilityConverter 中将 Status 的值与 ConverterParameter 中的值进行比较(您可以使用TryParse静态方法将其转换为枚举值。

希望有帮助。

于 2013-03-12T18:22:44.300 回答
0

将 DataTemplate 名称 StatusDataTemplate 或 Enums.ClientStatus 的默认 DataTemplate 定义为 TargetType。
在此模板中,定义一个 3 列 X 2 行的网格。
在每个网格单元格中,定义一个边框,使用 6 个枚举之一作为 ConverterParameter 的绑定作为背景,如果值 AND 参数 = 参数,则返回“正确”颜色的转换器,否则为透明。

然后你可以使用:

<ContentPresenter Content="{Binding Status}" />   

...如果您使用默认的 DTpl

或者 :

<ContentPresenter Content="{Binding Status}" ContentTemplate="{StaticResource StatusTemplate}"/>
于 2013-03-12T19:57:08.120 回答