如何区分 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();
}
}
我有一个数据集合,我想在 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();
}
}