gpt4 book ai didi

wpf - 使用 TemplateColumns 将 WPF DataGrid 绑定(bind)到 DataTable

转载 作者:行者123 更新时间:2023-12-02 08:04:44 26 4
gpt4 key购买 nike

我已经尝试了一切但一无所获,所以我希望有人能给我一个顿悟的时刻。我根本无法获得成功提取数据网格中数据的绑定(bind)。

我有一个包含 MyDataType 的多列的 DataTable

public class MyData
{
string nameData {get;set;}
bool showData {get;set;}
}

MyDataType 有 2 个属性(一个字符串,一个 bool 值)我创建了一个测试数据表

DataTable GetDummyData()
{
DataTable dt = new DataTable("Foo");
dt.Columns.Add(new DataColumn("AnotherColumn", typeof(MyData)));
dt.Rows.Add(new MyData("Row1C1", true));
dt.Rows.Add(new MyData("Row2C1", false));
dt.AcceptChanges();
return dt;
}

我有一个 WPF DataGrid,我想显示我的 DataTable。但我想要做的就是更改每个单元格的呈现方式,以显示每个单元格的 [TextBlock][Button] 以及绑定(bind)到 MyData 对象的值,这就是我遇到很多麻烦的地方。

我的 XAML 看起来像这样

<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="MyDataTemplate" DataType="MyData">
<StackPanel Orientation="Horizontal" >
<Button Background="Green" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5,0,0,0" Content="{Binding Path=nameData}"></Button>
<TextBlock Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,0,0" Text="{Binding Path=nameData}"></TextBlock>
</StackPanel>
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid>
<dg:DataGrid Grid.Row="1" ItemsSource="{Binding}" AutoGenerateColumns="True"
x:Name="dataGrid1" SelectionMode="Single" CanUserAddRows="False"
CanUserSortColumns="true" CanUserDeleteRows="False" AlternatingRowBackground="AliceBlue"
AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn" />
</Grid>

现在,加载后我所做的就是尝试将 DataTable 绑定(bind)到 WPF DataGrid

dt = GetDummyData();
dataGrid1.ItemsSource = dt.DefaultView;

TextBlock 和 Button 显示,但它们没有绑定(bind),这使得它们为空。如果有人知道如何解决这个问题,可以告诉我吗?这应该很简单,这就是微软让我们相信的。我已在 AutoGenerate 事件期间设置了 Column.CellTemplate,但仍然没有绑定(bind)。

请帮忙!!!

最佳答案

编辑:更新以反射(reflect) Aran Mulholland 的输入(请参阅评论)

显然,DataGrid 正在将整个 DataRowView 传递到每个单元格。这就是绑定(bind)不起作用的原因。您的 DataTemplate 期望 DataContext 的类型为 MyData,但实际上它的类型为 DataRowView。我建议的(有点黑客风格的)解决方法是创建一个自定义的 DataGridTemplateColumn 来获取您想要的 DataContext ,它将从 DataRowView 中提取必要的项目>。代码如下:

<Window x:Class="DataGridTemplateColumnSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WPFToolkit"
Title="Window1" Height="300" Width="300">
<Window.Resources>
<ResourceDictionary>
<DataTemplate x:Key="MyDataTemplate" DataType="DataRowView">
<StackPanel Orientation="Horizontal">
<Button Background="Green" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="5,0,0,0" Content="{Binding Path=nameData}"></Button>
<TextBlock Background="Green" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5,0,0,0" Text="{Binding Path=nameData}"></TextBlock>
</StackPanel>
</DataTemplate>
</ResourceDictionary>
</Window.Resources>
<Grid>
<dg:DataGrid Grid.Row="1" AutoGenerateColumns="True" x:Name="dataGrid1" SelectionMode="Single"
CanUserAddRows="False" CanUserSortColumns="true" CanUserDeleteRows="False"
AlternatingRowBackground="AliceBlue" AutoGeneratingColumn="dataGrid1_AutoGeneratingColumn"
ItemsSource="{Binding}" VirtualizingStackPanel.VirtualizationMode="Standard" />
</Grid>
</Window>
<小时/>
using System.Data;
using System.Windows;
using Microsoft.Windows.Controls;

namespace DataGridTemplateColumnSample
{
public partial class Window1
{
public Window1()
{
InitializeComponent();
DataContext = GetDummyData().DefaultView;
}

private static DataTable GetDummyData()
{
var dt = new DataTable("Foo");
dt.Columns.Add(new DataColumn("OneColumn", typeof(MyData)));
dt.Columns.Add(new DataColumn("AnotherColumn", typeof(MyData)));
dt.Rows.Add(new MyData("Row1C1", true), new MyData("Row1C2", true));
dt.Rows.Add(new MyData("Row2C1", false), new MyData("Row2C2", true));
dt.AcceptChanges();
return dt;
}

private void dataGrid1_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var column = new DataRowColumn(e.PropertyName);
column.Header = e.Column.Header;
column.CellTemplate = (DataTemplate)Resources["MyDataTemplate"];
e.Column = column;
}
}

public class DataRowColumn : DataGridTemplateColumn
{
public DataRowColumn(string column) { ColumnName = column; }
public string ColumnName { get; private set; }
protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
{
var row = (DataRowView) dataItem;
var item = row[ColumnName];
cell.DataContext = item;
var element = base.GenerateElement(cell, item);
return element;
}
}

public class MyData
{
public MyData(string name, bool data) { nameData = name; showData = data; }
public string nameData { get; set; }
public bool showData { get; set; }
}
}

注意:此方法似乎仅适用于容器虚拟化关闭或标准模式。如果VirtualizationMode设置为“回收”时,不应用模板。

关于wpf - 使用 TemplateColumns 将 WPF DataGrid 绑定(bind)到 DataTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2677446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com