如何区分 WPF ItemSsource 中的 ID 和显示值?

How do I distinguish between an ID and a display value in a WPF ItemSource?

我有一个数据集合,我想在 WPF DataGrid(C# 中)中显示。设置 DataGrid 的 ItemSource 属性 效果很好。该控件获取值,将它们放在列中,并且通常可以正常工作。问题是显示对象中的某些属性是 ID。对于编辑,这很好,但是为了在屏幕上显示它们,我想 return 它们对应的字符串。

换句话说,而不是:

我要:

在Qt中,::data()方法有一个"role"的概念。如何将特定字段的适当 "version" 传递给 DataGrid?

我是通过在左列中使用组合框来执行此操作的。示例如下:

<DataGrid Grid.Row="1" ItemsSource="{Binding Comms.View}" RowHeaderTemplate="{StaticResource TableRowTemplate}"
              HorizontalGridLinesBrush="#FFC9CACA" VerticalGridLinesBrush="#FFC9CACA" RowHeaderWidth="50" AutoGenerateColumns="False" >
        <DataGrid.Columns>
            <DataGridComboBoxColumn x:Name="CommTypeComboBoxColumn" Header="Type" 
                                    SelectedValuePath="CommTypeId" SelectedValueBinding="{Binding CommTypeId}">
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=CommTypes.View}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=CommTypes.View}" />
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
            </DataGridComboBoxColumn>
            <DataGridTextColumn Header="Waarde" Binding="{Binding CommValue,UpdateSourceTrigger=PropertyChanged}" Width="*"/>
        </DataGrid.Columns>
    </DataGrid>

希望您了解绑定,否则您将需要更多帮助。

如果框类型的文本是静态值(不是从数据库中读取),您可以使用简单的数据触发器来自定义每一行,如下所示:

<DataGrid.Columns>
    <DataGridTemplateColumn Header="Box Type">
        <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
                <TextBlock Text="UNKNOWN TYPE" x:Name="text"/>
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding Id}" Value="1">
                        <Setter TargetName="text" Property="Text" Value="TYPE 1"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Id}" Value="2">
                        <Setter TargetName="text" Property="Text" Value="TYPE 2"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Id}" Value="3">
                        <Setter TargetName="text" Property="Text" Value="TYPE 3"/>
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
    <DataGridTextColumn Header="Count" Binding="{Binding Count}"/>
</DataGrid.Columns>

注意TargetName="text"是TextBlock的名字,属性="Text"是TextBlock的名字。

您可以使用 IValueConverter 将 'Box type' 整数转换为字符串,如下所示:

class BoxTypeConverter : IValueConverter
{
    private static readonly List<string> idNames = new List<string>()
    {
        "Flat-rate (small)",
        "Flat-rate (medium)",
        "Flat-rate (large)",
        "Regional A",
        "Regional B",
        "Regional C"
    };

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var index = (int)value - 1;

        return index >= 0 && index < idNames.Count ? idNames[index] : value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var idName = (string)value;
        var index = idNames.IndexOf(idName);

        return index >= 0 ? index + 1 : int.Parse(idName, culture);
    }
}

然后像这样将它连接到 DataGrid 中:

XAML

<DataGrid AutoGeneratingColumn="OnAutoGeneratingColumn"/>

C#后面XAML

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyName == "BoxType")
    {
        var column = (DataGridBoundColumn)e.Column;
        var binding = (Binding)column.Binding;
        binding.Converter = new BoxTypeConverter();
    }
}