WPF根据绑定值更改数据网格行的PackIcon

时间:2019-09-08 01:41:12

标签: c# wpf xaml datagrid material-design-in-xaml

我正在努力做到这一点: Add a Image in the DataGridTemplateColumn,但不要使用Image来使用materialDesign:PackIcon。 这是我的代码。

<DataGridTemplateColumn Header="Message">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <materialDesign:PackIcon Kind="{Binding MsgStatus,Converter={StaticResource NumberToIconConverter}}" Foreground="Green"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

MsgStatus是列值,根据其值,图标会有所不同。这是通过返回IconKind的转换器完成的。

public class NumberToIconConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            string input = value as string;

            switch (input)
            {
                case "1":
                    return MaterialDesignThemes.Wpf.PackIconKind.Alarm;
                case "2":
                    return MaterialDesignThemes.Wpf.PackIconKind.Message;
                default:
                    return DependencyProperty.UnsetValue;
            }
        }

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

在用户控件中引用了转换器,但似乎从未调用过转换器,并且在调试或执行过程中没有错误。

<UserControl.Resources>
        <local:NameToBrushConverter x:Key="NumberToIconConverter"/>
</UserControl.Resources>

与Image或textblock(例如)在同一列上的其他转换器使用相同的绑定有效,但对于materialDesign:PackIcon,则永远不会调用该转换器,因此图标不会更改。绑定是否错误?

编辑:

已解决:未调用Converter,将引用替换为:

<UserControl.Resources>
        <local:NumberToIconConverter x:Key="NumberToIconConverter"/>
</UserControl.Resources>

使用答案的转换器,添加了DBNull检查以避免Null异常:

public class NumberToIconConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value == DBNull.Value)
            {
                return DependencyProperty.UnsetValue;
            }
            var input = System.Convert.ToInt16(value);

            switch (input)
            {
                case 1:
                    return MaterialDesignThemes.Wpf.PackIconKind.Alarm;
                case 2:
                    return MaterialDesignThemes.Wpf.PackIconKind.Message;
                default:
                    return DependencyProperty.UnsetValue;
            }
        }

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

1 个答案:

答案 0 :(得分:1)

我认为问题出在将int投射到string的转换器中。 我用您的代码和此模型创建一个示例项目:

public class Messages
{
    public int MsgStatus { get; set; }
}

然后我将您的转换更改为此(请看第2行):

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    var input = System.Convert.ToInt16(value);

    switch (input)
    {
        case 1:
            return MaterialDesignThemes.Wpf.PackIconKind.Alarm;
        case 2:
            return MaterialDesignThemes.Wpf.PackIconKind.Message;
        default:
            return DependencyProperty.UnsetValue;
    }
}

对我有用。输出:

enter image description here