【问题标题】:How to customize UWP DataGrid from MyToolkit?如何从 MyToolkit 自定义 UWP DataGrid?
【发布时间】:2019-11-05 03:32:39
【问题描述】:

我正在构建一个 UWP 应用程序,我需要将 DataGrid 分成四个相等的部分,如下所示:

但到目前为止,设置单元格的颜色没有任何效果。有没有办法在 C# 中以编程方式执行此操作?

编辑:

经过大量研究,我最终使用 Grid、一堆标签 + 边框和一个虚拟文本框从头开始开发。最后的结果其实还不错:

【问题讨论】:

  • 是的,我个人最喜欢这样做的方式是不打扰 MS 内置类型......只需自己用 C# 代码编写它 - 省去了很多麻烦和黑客攻击。如果我无法在合理的时间内得到答复,那只是我个人的工作方式。
  • 我认为这可能是最好的选择。但是我已经在考虑“版本”时感到头疼。表格必须是可编辑的。
  • 文本框是可编辑的......在网格中有一堆......顺便说一句,我不会手动执行此操作-我会编写一些代码来智能地生成单元格。

标签: c# uwp datagrid


【解决方案1】:

有一种简单的方法可以满足您的要求。您只需为 DataGridTemplateColumn.CellTemplate 定义 DataTemplate 并将背景绑定到自定义类中的某个属性。

请看我下面的简单代码示例:

<controls:DataGrid
AutoGenerateColumns="False"
ItemsSource="{Binding tests}" GridLinesVisibility="All">
        <controls:DataGrid.Columns>
            <!-- Name Column -->
            <controls:DataGridTemplateColumn Header="Name">
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"  Background="{Binding Color1}">
                            <TextBlock
                        Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
            </controls:DataGridTemplateColumn>
            <controls:DataGridTemplateColumn Header="Name">
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"  Background="{Binding Color1}">
                            <TextBlock
                        Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
            </controls:DataGridTemplateColumn>
            <controls:DataGridTemplateColumn Header="Name">
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"  Background="{Binding Color1}">
                            <TextBlock
                        Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
            </controls:DataGridTemplateColumn>
            <controls:DataGridTemplateColumn Header="Name">
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"  Background="{Binding Color2}">
                            <TextBlock
                        Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
            </controls:DataGridTemplateColumn>
            <controls:DataGridTemplateColumn Header="Name">
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"  Background="{Binding Color2}">
                            <TextBlock
                        Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
            </controls:DataGridTemplateColumn>
            <controls:DataGridTemplateColumn Header="Name">
                <controls:DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal"  Background="{Binding Color2}">
                            <TextBlock
                        Text="{Binding Name}" />
                        </StackPanel>
                    </DataTemplate>
                </controls:DataGridTemplateColumn.CellTemplate>
            </controls:DataGridTemplateColumn>
        </controls:DataGrid.Columns>
    </controls:DataGrid>
public sealed partial class MainPage : Page
{
    public ObservableCollection<Test> tests { get; set; }

    public MainPage()
    {
        this.InitializeComponent();
        tests = new ObservableCollection<Test>();
        for (int i = 0; i < 15; i++)
        {
            if (i < 7)
            {
                tests.Add(new Test() { Name = "Name " + i, Color1 = new SolidColorBrush(Colors.Yellow), Color2 = new SolidColorBrush(Colors.Red) });
            }
            else
            {
                tests.Add(new Test() { Name = "Name " + i, Color1 = new SolidColorBrush(Colors.Green), Color2 = new SolidColorBrush(Colors.LightBlue) });
            }
        }
        this.DataContext = this;
    }
}

public class Test
{
    public string Name { get; set; }
    public SolidColorBrush Color1 { get; set; }
    public SolidColorBrush Color2 { get; set; }
}

【讨论】:

  • 表格的大小(列和行)是可变的。所以我不能在 XAML 中定义静态列。有没有办法以编程方式做到这一点?
  • @alurab 如果是自动生成的数据网格,目前是不可能的。请在Windows Community Toolkit Issues 上提交功能请求
  • 实际上,我在运行时使用 DataTable + ObservableCollection 为 DataGrid 提供数据。还是不可能?
  • @alurab 是的。如果您不能使用我上面的方式(使用DataGridTemplateColumnCellTemplate)来显示您的数据,那么目前没有其他方法可以实现您的目标。请在Windows Community Toolkit Issues 上提交功能请求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多