作为列数未知的 DataTemplate 的网格
Grid as DataTemplate with unknown number of columns
我使用 XAML 开发我的应用程序 UI,在后台我 运行 一个 C# 程序。
为了更容易解释:假设程序应在 ListView/Grid 中显示参数。
- 第 1 列是参数名称(字符串)
- 第2列为参数值(字符串或字符串[])
参数值可以是单个值(显示为标签)或 vector/matrix(在此单元格内显示为网格)。我不知道如何在这里添加一个未知列号的其他网格,每个参数的数字都会不同。
所有参数都在一个列表中,并动态加载 ItemSource + DisplayMemberBinding。
所以我需要:
- DataTemplate 中的网格
- 行数未知的网格
<DataTemplate x:Key="labelTemplate">
<Label Content="{Binding Path=Value}" Width="Auto"></Label>
</DataTemplate>
<DataTemplate x:Key="table2DTemplate">
</DataTemplate>
<local:ParameterTemplateSelector
x:Key="parameterTemplateSelector"
LabelTemplate="{StaticResource labelTemplate}"
Table2DTemplate ="{StaticResource table2DTemplate}"/>
我的数据模板 + 模板选择器:
<ListView ItemsSource="{Binding Parameters}" Margin="10,156,10.286,10.429" x:Name="listBox1" FontSize="8" Background="White" Foreground="Black" BorderBrush="#FF60EFBB">
<ListView.View>
<GridView>
<GridViewColumn
Header="Name"
Width="Auto"
DisplayMemberBinding="{Binding Name}" />
<GridViewColumn
Header="Value"
Width="Auto"
CellTemplateSelector="{StaticResource parameterTemplateSelector}" />
<GridViewColumn
Header="Unit"
Width="Auto"
</GridView>
</ListView.View>
</ListView>
这就是你想要做的。值转换器是必需的,因为您不能将 ItemsControl(或其任何子类,如 ListBox、ListView 等)绑定到二维数组。所以我们将二维数组转换为 List<List<String>>
并将其显示在嵌套的 ItemsControls 中。转换器包含在下面。
如果您愿意在整个代码中使用 List<List<String>>
来替代 string[,]
,这可以简化,但这可能不切实际。
<DataTemplate x:Key="table2DTemplate">
<ItemsControl
ItemsSource="{Binding Value, Converter={StaticResource ListOfListsFrom2DArray}}"
>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid
Rows="1"
/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
转换器。这里没有太多内容,只有一个 LINQ 表达式 I 。
public class ListOfListsFrom2DArray : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var values = value as string[,];
//
var result = values.Cast<string>()
// Use overloaded 'Select' and calculate row index.
.Select((x, i) => new { x, index = i / values.GetLength(1) })
// Group on Row index
.GroupBy(x => x.index)
// Create List for each group.
.Select(x => x.Select(s => s.x).ToList())
.ToList();
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
我使用 XAML 开发我的应用程序 UI,在后台我 运行 一个 C# 程序。
为了更容易解释:假设程序应在 ListView/Grid 中显示参数。
- 第 1 列是参数名称(字符串)
- 第2列为参数值(字符串或字符串[])
参数值可以是单个值(显示为标签)或 vector/matrix(在此单元格内显示为网格)。我不知道如何在这里添加一个未知列号的其他网格,每个参数的数字都会不同。
所有参数都在一个列表中,并动态加载 ItemSource + DisplayMemberBinding。
所以我需要: - DataTemplate 中的网格 - 行数未知的网格
<DataTemplate x:Key="labelTemplate">
<Label Content="{Binding Path=Value}" Width="Auto"></Label>
</DataTemplate>
<DataTemplate x:Key="table2DTemplate">
</DataTemplate>
<local:ParameterTemplateSelector
x:Key="parameterTemplateSelector"
LabelTemplate="{StaticResource labelTemplate}"
Table2DTemplate ="{StaticResource table2DTemplate}"/>
我的数据模板 + 模板选择器:
<ListView ItemsSource="{Binding Parameters}" Margin="10,156,10.286,10.429" x:Name="listBox1" FontSize="8" Background="White" Foreground="Black" BorderBrush="#FF60EFBB">
<ListView.View>
<GridView>
<GridViewColumn
Header="Name"
Width="Auto"
DisplayMemberBinding="{Binding Name}" />
<GridViewColumn
Header="Value"
Width="Auto"
CellTemplateSelector="{StaticResource parameterTemplateSelector}" />
<GridViewColumn
Header="Unit"
Width="Auto"
</GridView>
</ListView.View>
</ListView>
这就是你想要做的。值转换器是必需的,因为您不能将 ItemsControl(或其任何子类,如 ListBox、ListView 等)绑定到二维数组。所以我们将二维数组转换为 List<List<String>>
并将其显示在嵌套的 ItemsControls 中。转换器包含在下面。
如果您愿意在整个代码中使用 List<List<String>>
来替代 string[,]
,这可以简化,但这可能不切实际。
<DataTemplate x:Key="table2DTemplate">
<ItemsControl
ItemsSource="{Binding Value, Converter={StaticResource ListOfListsFrom2DArray}}"
>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ItemsControl ItemsSource="{Binding}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid
Rows="1"
/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</DataTemplate>
转换器。这里没有太多内容,只有一个 LINQ 表达式 I
public class ListOfListsFrom2DArray : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var values = value as string[,];
//
var result = values.Cast<string>()
// Use overloaded 'Select' and calculate row index.
.Select((x, i) => new { x, index = i / values.GetLength(1) })
// Group on Row index
.GroupBy(x => x.index)
// Create List for each group.
.Select(x => x.Select(s => s.x).ToList())
.ToList();
return result;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}