【问题标题】:Binding to simple properties in WPF DataGrid绑定到 WPF DataGrid 中的简单属性
【发布时间】:2015-11-21 11:33:25
【问题描述】:

我在绑定到模型上的属性时遇到问题。在 DataGrid 中,我正在显示错误。每个错误都有属性ErrorDescription,它本身也有属性Severity

我可以在下面的 DataGrid 的 TextColumn 中绑定到 Severity,但是在 TemplateColumn 中绑定到 Severity 失败并出现错误

“无法解析类型数据上下文中的属性“ErrorDescription” 主视图模型”

我的图像列中的 DataContext 与我的第一个文本列中的不同。这是为什么呢?

  <DataGrid ItemsSource ="{Binding Errors}" AutoGenerateColumns="False">
        <DataGrid.Columns>

            // works
            <DataGridTextColumn Binding="{Binding ErrorDescription.Severity}"></DataGridTextColumn>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Image>
                            <Image.Style>
                                <Style TargetType="Image">
                                    <Style.Triggers>
                                       // Binding fails
                                        <DataTrigger Binding="{Binding ErrorDescription.Severity}" Value="Unknown">
                                            <Setter Property="Source" Value="/error.jpg"/>
                                        </DataTrigger>
                                        // Binding fails
                                        <DataTrigger Binding="{Binding ErrorDescription.Severity}" Value="Ok">
                                            <Setter Property="Source" Value="/ok.jpg"/>
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Image.Style>
                        </Image>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
      </DataGrid>

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    使用转换器而不是 DataTrigger 怎么样? 当我想根据枚举显示图标或特定属性值时,我会使用转换器。

    转换器将与此类似:

    public class ErrorSeverityConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            Severity severity = (Severity)value;
            switch(severity)
            {
                case Severity.Unknown:
                    return "/error.jpg";
    
                case Severity.Ok:
                    return "/ok.jpg";
            }
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    

    还有一个非常相似的问题,即使不在 DataGridTemplateColumn 上

    Enable TextBox depending on enum value

    【讨论】:

    • Severity 确实是一个枚举,但是,我可以毫不费力地在 TextColumn 中显示它的值,但我不能使用在 TemplateColumn 中获取它的值。我会调整我的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-29
    • 1970-01-01
    • 2010-12-01
    • 2014-02-03
    相关资源
    最近更新 更多