我正在使用 MVVM 模式开发 WPF 项目。
到目前为止一切正常,但现在我面临一个丑陋的设计问题。为了显示我的数据,我DataGrid
像其他人一样使用 a ,但我ItemsSource
的是 aList<List<MyClass>>
因为我需要通过DataTemplate
. 在我DatagridCells
的身上,我也得到了这个工作,但现在我需要在一些 UI 条目之后重新排序我不存在的列,但这会很痛苦,所以想知道你将使用什么样的类表类来提供这些对象?
我需要能够做什么(易于编程):
- 访问每个单元格
- 重新排序/交换列
- 重新排序/交换行
编辑:
之后现在看到要理解我在这里实际做了一些进一步的信息并不容易。
因为他们不明白aList<List<MyClass>>
是什么,它只不过是aMyClass[,]
@Charleh
"How do you reorder non-existent columns?"
绝妙的问题......如果你能正确阅读,你会发现我需要一个新类型的数据提供者,也就是一个真正的表,而不是我List<List<MyClass>>
没有列的人,因为如果你有这样一个List<List<MyClass>>
让你命名 的让MyListLister
你MyListLister[0]
将是一个行并且MyListLister[0][0]
会成为一个细胞
You mean you have a single column because you are using a data template to show the object?
我为每个代码创建我的 DataGrid,因为它需要是动态的,因为用户可以在每次选择后根据 Combobox 选择更改整个 DataGrid 的样式我需要重新创建我的 DataGrid 并修改我的 MyListLister 但要将其用作 ItemsSoucre 我必须做这个黑客
@HighCore
Post the relevant XAML
并没有真正有用的 xaml,所以我会在休息后提供一个简单的例子
编辑2:
抱歉这个例子的延迟,但这是我的简单例子
主窗口
XAML
<Window x:Class="TableToDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Label Name="theElement"/>
</Window>
。CS
private void Window_Loaded(object sender, RoutedEventArgs e)
{
theElement.Content = new MyUsercontrol();
}
我的用户控件
XAML
<UserControl x:Class="TableToDataGrid.MyUsercontrol"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vmv="clr-namespace:TableToDataGrid">
<UserControl.Resources>
<DataTemplate x:Key="MyCellTemplate" DataType="{x:Type vmv:myClass}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</UserControl.Resources>
<Label Name="AddYourDataGridHere"/>
</UserControl>
。CS
using System.Linq;
using System.Windows;
using System.Collections;
using System.Windows.Data;
using System.Windows.Controls;
using System.Collections.Generic;
namespace TableToDataGrid
{
/// <summary>
/// Interaktionslogik für MyUsercontrol.xaml
/// </summary>
public partial class MyUsercontrol : UserControl
{
DataGrid myDataGrid = new DataGrid();
public MyUsercontrol()
{
InitializeComponent();
var list = new List<List<myClass>>();
for (int row = 0; row < 3; row++)
{
var myRow = new List<myClass>();
for (int col = 0; col < 5; col++)
myRow.Add(new myClass() { ID = col, Name = "Row" + row + " Column:" + col });
list.Add(myRow);
}
#region the hack
for (int c = 0; c < 5; c++)
{
DataGridTemplateColumn column = new DataGridTemplateColumn();
var factory = new FrameworkElementFactory(typeof(ContentPresenter));
factory.SetBinding(ContentPresenter.ContentProperty, new Binding(string.Format("[{0}]", c.ToString())));
factory.SetValue(ContentPresenter.ContentTemplateProperty, this.FindResource("MyCellTemplate") as DataTemplate);
column.SetValue(DataGridTemplateColumn.CellTemplateProperty, new DataTemplate { VisualTree = factory });
myDataGrid.Columns.Add(column);
}
#endregion the hack
myDataGrid.ItemsSource = list.AsEnumerable<IEnumerable>();
myDataGrid.AutoGenerateColumns = false;
AddYourDataGridHere.Content = myDataGrid;
}
}
}
我的类.cs
namespace TableToDataGrid
{
public class myClass
{
public int ID { get; set; }
public string Name { get; set; }
}
}
如您所见,结果是一个普通的表。有没有人知道如何以更简单的方式提供相同的结果(ItemsSource
)我可以从上面做我的 3 分?