【问题标题】:Grid as DataTemplate with unknown number of columns网格作为具有未知列数的 DataTemplate
【发布时间】:2017-10-31 03:33:24
【问题描述】:

我使用 XAML 开发我的应用程序 UI,并在后台运行一个 C# 程序。

为了更容易解释:假设程序应在 ListView/Grid 中显示参数。

  1. 第 1 列是参数名称(字符串)
  2. 第 2 列是参数值(字符串或字符串 [,])

参数值可以是单个值(显示为标签)或向量/矩阵(显示为此单元格内的网格)。我不知道如何在这里添加一个列号未知的其他网格,每个参数的数字都会不同。

所有参数都在一个列表中,并通过 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>

【问题讨论】:

  • 嗨,你能告诉我更详细的你的意思吗?
  • WPF 不愿意使用二维(或更多)维数组作为项目源。是否可以将其替换为List&lt;List&lt;String&gt;&gt;,或者将其转换为显示目的?

标签: c# .net xaml grid datatemplate


【解决方案1】:

这就是你想要做的。值转换器是必需的,因为您不能将 ItemsControl(或其任何子类,如 ListBox、ListView 等)绑定到二维数组。因此,我们将二维数组转换为List&lt;List&lt;String&gt;&gt; 并将其显示在嵌套的 ItemsControls 中。转换器包括在下面。

如果您愿意在整个代码中使用List&lt;List&lt;String&gt;&gt; 来代替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 stole from another StackOverflow answer

public class ListOfListsFrom2DArray : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var values = value as string[,];

        //  https://stackoverflow.com/a/37458182/424129
        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();
    }
}

【讨论】:

  • 您好 Ed,感谢您的帮助,XAML 帮助了我。现在它正在工作:D 干得好!
猜你喜欢
  • 2017-10-27
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 2016-09-05
相关资源
最近更新 更多