【问题标题】:Displaying multidimensional data in WPF在 WPF 中显示多维数据
【发布时间】:2011-02-10 09:21:24
【问题描述】:

在 WPF 中显示多维数据的最佳方式是什么?直到运行时我才知道数据的大小/形状。理想情况下,我想使用数据绑定,但这不是严格的要求。我在考虑某种网格,但我不知道如何动态绑定到数据并让它计算出行数和列数。请给点建议和例子?

【问题讨论】:

  • 澄清:尺寸/形状是指 MxN,而不是圆形/正方形。我正在处理的数组数据可以是从 1D 到 6D 的任意位置,我想以类似表格的方式显示(更多的 2D 应该只在“表格”中连续显示)。我不是在处理锯齿状数组或稀疏矩阵。我的问题是,什么是用于实现这个“表”的好控件。
  • 另一个澄清:我还需要它有点像 Excel 表。例如,我需要能够选择要复制/粘贴的矩形数据。
  • 你知道,如果你不给你的问题的正确答案打分,不要指望一个巨大的回应(毫无疑问,这些是正确的):)
  • 我还没有机会测试它们。一旦有机会尝试,我肯定会给出分数并选择最佳答案。不幸的是,我真的只能在晚上工作,因为这不是我日常工作的一部分。

标签: c# wpf data-binding visual-studio-2010 multidimensional-array


【解决方案1】:

听起来您想要一个类似于 Excel 的界面来处理具有编辑功能的二维数组。对于其他维度,您必须提供选项卡或一系列组合框。

查看 WPF 工具包 DataGrid。有一个自动生成列的选项。尝试一下。

但是,您将需要一些代码来处理其他维度,因为 Datagrid 只能表示 2D 数据。

科里

编辑: (04/28/2010) 这是一个可行的解决方案。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Data;
using Microsoft.Windows.Controls;

namespace WpfApplication2
{
    public partial class MainWindow : Window
    {
    public List<List<object>> TheData { get; set; }

    public MainWindow()
    {
        InitializeComponent();

        // Generate some random data
        Random r = new Random();

        TheData = new List<List<object>>
        {
            new List<object> { r.Next(100), r.Next(100), r.Next(100),r.Next(100) },
            new List<object> {  r.Next(100), r.Next(100), r.Next(100),r.Next(100) },
            new List<object> {  r.Next(100), r.Next(100), r.Next(100) },
            new List<object> {  r.Next(100), r.Next(100), r.Next(100),r.Next(100) },
            new List<object> {  r.Next(100), r.Next(100), r.Next(100),r.Next(100) },
            new List<object> {  r.Next(100), r.Next(100), r.Next(100),r.Next(100), r.Next(100) }
        };

        // Now bind data to the grid
        // We need at least one element
        if (TheData.Count > 0)
        {
            // Find the longest row so we create enough columns
            var max = TheData.Max(c => c.Count);

            for (var i = 0; i < max; i++)
            {
                TheGrid.Columns.Add(
                    new DataGridTextColumn
                    {
                        Header = string.Format("Column: {0:00}", i),
                        Binding = new Binding(string.Format("[{0}]", i))
                    }
                    );
            }
        }

        TheGrid.ItemsSource = TheData;
    }
}

}

XAML...

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
    Title="GridTest">
<Grid x:Name="LayoutGrid">
    <toolkit:DataGrid x:Name="TheGrid"
                      AutoGenerateColumns="False"
                      IsReadOnly="False"
                      CanUserAddRows="False"/>
</Grid>

有关此方法的一些注意事项,如果您允许编辑数据并允许交错数组,则需要在短行上新建一个新列表。

就 > 2D 数据而言,您将需要某种选项来选择另一个维度,因为数据网格只能表示 2D 数据。

【讨论】:

  • 这正是我要说的! WPF 工具包 DataGrid 看起来很有前途。
【解决方案2】:

我认为对你来说最好的解决方案是只使用 TreeView :) 如果你正在使用 MVVM,这是我发现的关于 TreeView 的最精彩的教程:http://www.codeproject.com/KB/WPF/TreeViewWithViewModel.aspx

如果您需要更多信息,请随时通知我。

【讨论】:

  • TreeView 对我来说不是一个好的解决方案。它是数组数据,需要以类似表格的方式显示(如excel网格或其他东西)
  • 在这种情况下,我有 2 种选择供您选择。首先:您可以将树视图模板化,使其看起来像一个表格(我坚持使用 TreeView,因为它非常容易绑定到分层数据结构)。第二:您可以只使用带有绑定行/列的常规网格或带有绑定模板列表框项目的列表框。如果我是你的,我会选择第一个解决方案 :) 问候,Piotr。
  • 我还需要它来充当 Excel 表格。例如,我需要能够选择要复制/粘贴的矩形数据。我不认为 TreeView 可以处理这种类型的功能。
  • 您会感到惊讶;)我有一种感觉,应该再次提出这个问题,但标题不同(例如,如何在我的 WPF 应用程序中模仿 Excel 行为)。我为您找到了一些东西,您可以免费试用:devexpress.com/Products/NET/Controls/WPF/Grid/filter.xml 恐怕他们使用常规 Grid 来实现它。
【解决方案3】:

我做过类似的事情,其中​​数据是一个或多个列表,或者一个数组数组。不知道您对使用多维数组和这种“网格状”数据的方法有多大的限制。

这是我绑定列表列表的方式。

        <Resources>
        <DataTemplate x:Key="GridDtInner">
            <TextBlock Text="{Binding YourProperty}"/>
        </DataTemplate>
        <DataTemplate x:Key="GridDtOuter">
            <ItemsControl ItemsSource="{Binding}" ItemTemplate="{DynamicResource GridDtInner}" />
        </DataTemplate>     
        </Resources> 
        <ItemsControl  ItemTemplate="{DynamicResource GridDtOuter}" ItemsSource="{Binding YourList, Mode=Default}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
        </ItemsControl>

显然,为了简洁起见,我已经剪掉了一些东西,但我希望这是有道理的。

问候,

迈克·麦考利

【讨论】:

    【解决方案4】:

    我做过一些非常相似的事情,但很可能是在与你工作的行业完全不同的行业。

    当您说数据的大小/形状时,我假设您不是从字面上谈论圆形与正方形,而是说您有一个 NxM 的数据矩阵并且您不知道 N 和M 直到运行时。我还假设您想在 NxM 矩阵的每个单元格中显示某种文本。

    请注意,以下 XAML 已根据我的代码进行了修改,未经测试,但我想向您介绍一下我是如何做到的。

            <ListBox Width="300" Height="300" ScrollViewer.HorizontalScrollBarVisibility="Disabled" ItemsSource="{Binding Cells}">
                <ListBox.ItemsPanel>
                    <ItemsPanelTemplate>
                        <WrapPanel Width="Auto" Height="Auto" ItemWidth="{Binding CellBoundary}" ItemHeight="{Binding CellBoundary}"/>
                    </ItemsPanelTemplate>
                </ListBox.ItemsPanel>
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Width="{Binding CellDiameter}" Height="{Binding CellDiameter}" Text="{Binding CellValue}"></TextBlock>
                    </DataTemplate>                    
                </ListBox.ItemTemplate>
            </ListBox>
    

    我将 ListBox 的 ItemsPanel 更改为 ListBox。因此,只要您有一个 NxM 矩阵(它也可以是稀疏的),您就可以将其视为具有 NxM 个单元的向量。每个单元格实际上都是 ListBox 中的一个项目。

    接下来,将每个 ListBox 项的 DataTemplate 设置为 TextBlock,其中 TextBlock 的大小是数据绑定的,并且显示的值在单元格的 CellValue 成员中,这是一个 ObservableCollection&lt;double&gt; 或类似的数据绑定到Cells

    此时您在后面的代码中唯一需要做的就是弄清楚 N 和 M 是什么,并进行必要的数学运算来计算 ListBox 的大小(可以在 ViewBox 内以使其缩放) ,以便相应地显示值。显然,您还需要将我的硬编码值更改为数据绑定的值。

    这种方法对我来说似乎是最简单的,所以这就是我一直使用它的原因。

    我还应该补充一点,为了做一个稀疏矩阵,你需要将 CellValue 设置为 0,但如果值为 0,你也可以使用 DataTrigger 使 TextBlocks 不可见,从而产生稀疏矩阵的错觉.

    【讨论】:

      【解决方案5】:

      我刚刚在 WPF 工具包中发现了 DataGrid,它显示出一些潜力。它至少允许选择单个单元格。当我弄清楚数据绑定时,我会发布代码。
      http://wpf.codeplex.com/releases/view/40535
      http://windowsclient.net/wpf/wpf35/wpf-35sp1-toolkit-datagrid-feature-walkthrough.aspx

      【讨论】:

        猜你喜欢
        • 2016-04-05
        • 1970-01-01
        • 1970-01-01
        • 2020-01-28
        • 2023-03-04
        • 2014-03-11
        • 2013-12-11
        • 2015-03-22
        相关资源
        最近更新 更多