首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF根据绑定值更改数据行的PackIcon。

WPF根据绑定值更改数据行的PackIcon。
EN

Stack Overflow用户
提问于 2019-09-08 01:41:12
回答 1查看 1.6K关注 0票数 1

我正试图实现这一目标:Add a Image in the DataGridTemplateColumn,但不是使用图像,而是使用materialDesign:PackIcon。这是我的密码。

代码语言:javascript
复制
<DataGridTemplateColumn Header="Message">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <materialDesign:PackIcon Kind="{Binding MsgStatus,Converter={StaticResource NumberToIconConverter}}" Foreground="Green"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

MsgStatus是列值,根据其值,图标将是不同的。这是通过一个转换器实现的,它返回IconKind。

代码语言:javascript
复制
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();
        }
    }

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

代码语言:javascript
复制
<UserControl.Resources>
        <local:NameToBrushConverter x:Key="NumberToIconConverter"/>
</UserControl.Resources>

在同一列的图像或文本块上使用与其他转换器相同的绑定(例如)使用materialDesign:PackIcon,转换器永远不会被调用,因此图标不会改变。我的装订错了吗?

编辑:

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

代码语言:javascript
复制
<UserControl.Resources>
        <local:NumberToIconConverter x:Key="NumberToIconConverter"/>
</UserControl.Resources>

转换器使用应答,添加了DBNull检查以避免空异常:

代码语言:javascript
复制
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();
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2019-09-08 04:37:37

我认为问题在于你的转换器,你把int转换成string。我用您的代码和这个模型创建了一个示例项目:

代码语言:javascript
复制
public class Messages
{
    public int MsgStatus { get; set; }
}

我将您的转换改为这个(参见第2行):

代码语言:javascript
复制
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;
    }
}

这是我的工作。输出:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57838595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档