【问题标题】:WPF Change the PackIcon of datagrid row depending on binding valueWPF 根据绑定值更改数据网格行的 PackIcon
【发布时间】:2019-09-08 01:41:12
【问题描述】:

我正在努力做到这一点: 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>

对同一列上的其他转换器使用相同的绑定,图像或文本块(例如)有效,但使用 materialDesign:PackIcon 转换器永远不会被调用,因此图标不会改变。我的绑定有问题吗?

编辑:

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

<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();
        }
    }

【问题讨论】:

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


    【解决方案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;
        }
    }
    

    它对我有用。输出:

    【讨论】:

    • 我不知道为什么仍然不适合我,我认为它必须与绑定有关,我在转换器上设置了一个断点,它永远不会达到那个点。就像数据模板的数据上下文中不存在 MsgStatus 一样。
    • 谢谢,我会把它标记为答案,还有没有调用转换器的原因是我引用了另一个转换器 NameToBrushConverter 准确地说。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2010-11-15
    • 1970-01-01
    相关资源
    最近更新 更多