gpt4 book ai didi

c# - 数据表和 AutoGeneratedColummns 中带有枚举的 WPF DataGrid ="True"

转载 作者:行者123 更新时间:2023-11-30 12:58:46 26 4
gpt4 key购买 nike

我的枚举、数据表和数据网格有问题。我有以下代码:

StateEnum.cs:

public enum StateEnum
{
Pass,
Fail,
Mandatory,
Retest
}

主窗口.xaml.cs:

private void Button_Click(object sender, RoutedEventArgs e)
{
ViewModel.MainViewModel vm = VmSingleton.GetVmInstance();
vm.ModuleRecords = new System.Data.DataTable();

DataTable dt = new DataTable("TableName");
dt.Columns.Add("Id",typeof(int));
dt.Columns.Add("Operation1", typeof(StateEnum));
dt.Columns.Add("Operation2", typeof(StateEnum));
dt.Columns.Add("Operation3", typeof(StateEnum));
dt.Columns.Add("Operation4", typeof(StateEnum));

vm.ModuleRecords = dt;

for (int i = 0; i < 5; i++)
{
DataRow newDR = dt.NewRow();
foreach (DataColumn col in dt.Columns)
{
int j = 1;
if (col.ColumnName == "Id")
newDR[col.ColumnName] = i + j;
else
newDR[col.ColumnName] = StateEnum.Pass;
j++;
}
dt.Rows.Add(newDR);
}
}

主窗口.xaml


<DataGrid Grid.Row="0" ItemsSource="{Binding ModuleRecords}" AutoGenerateColumns="True" />
<Button Grid.Row="1" Content="Ok" Click="Button_Click"/>

虽然 Id 显示在单元格中,但单元格中的枚举不会直接显示。当我点击一个单元格时,我可以选择正确的枚举。我该如何解决?

编辑:
对于模棱两可的描述,我深表歉意。就我而言,我想显示数据表的数据,因为我不知道在设计时必须显示多少数据。这就是选择数据表的原因。在我的示例中,我可以有更多或更少的操作,但我不知道有多少...

我想我在发帖之前把我的问题简单化了太多。我希望这个代码示例使它更清楚:

private void Button_Click(object sender, RoutedEventArgs e)
{
DataAccess.DataAccessor accessor = new DataAccess.DataAccessor();

// i dont know how much operations i got at design time
List<string> operationHeaders = accessor.getOperationHeaders();

ViewModel.MainViewModel vm = VmSingleton.GetVmInstance();
vm.ModuleRecords = new System.Data.DataTable();

DataTable dt = new DataTable("TableName");
dt.Columns.Add("Id",typeof(int));

// this is because i have to go through with a for-each
// to initialize the header of the table
foreach (string header in operationHeaders)
{
dt.Columns.Add(header, typeof(StateEnum));
}

vm.ModuleRecords = dt;

// fil the datatable with data...
...
}

我希望现在情况更清楚了......

编辑 2:
我的问题是枚举值的绑定(bind)无法正常工作。我在 Viewmodel 中设置了值,但 datagridview 中的枚举属性仅显示一个空白单元格。我希望看到枚举属性的值,例如“通过”或“失败”...当我点击一个单元格时,我看到枚举的可能值,但它不是直接设置的。

最佳答案

您不需要使用 DataTable,而是使用 POCO,在迁移到 MVVM 时您的生活会轻松很多。下面的要干净得多。
我已经复制了完整的 Windows 代码,这样您就可以运行演示而不会遇到麻烦,但是您必须注意 xaml 导入的命名空间和 Window.Resources 部分:

namespace WpfApplication1
{

public enum StateEnum
{
Pass,
Fail,
Mandatory,
Retest
}

public class ModuleRecord
{
public int Id { get; set; }
public StateEnum Operation1 { get; set; }
public StateEnum Operation2 { get; set; }
public StateEnum Operation3 { get; set; }
public StateEnum Operation4 { get; set; }
}


public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ModuleRecords = new ObservableCollection<ModuleRecord>();
}

public ObservableCollection<ModuleRecord> ModuleRecords { get; set; }

private void Button_Click(object sender, RoutedEventArgs e)
{

for (int i = 0; i < 5; i++)
{
int j = 1;
var mRecord = new ModuleRecord();
mRecord.Id = j;
mRecord.Operation1 = StateEnum.Pass;
mRecord.Operation2 = StateEnum.Pass;
mRecord.Operation3 = StateEnum.Pass;
mRecord.Operation4 = StateEnum.Pass;
ModuleRecords.Add(mRecord);

}
DataContext = this;
}
}
}

...还有他们的xaml

<Window x:Class="WpfApplication1.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"
xmlns:local="clr-namespace:WpfApplication1"
xmlns:System="clr-namespace:System;assembly=mscorlib">

<Window.Resources>
<ObjectDataProvider x:Key="EnumDataProvider"
MethodName="GetValues"
ObjectType="{x:Type System:Enum}">

<ObjectDataProvider.MethodParameters>
<x:Type TypeName="local:StateEnum"/>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>

</Window.Resources>

<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition />
</Grid.RowDefinitions>
<DataGrid Grid.Row="0" ItemsSource="{Binding ModuleRecords}" AutoGenerateColumns="False">

<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Id}" Header="Id" />
<DataGridComboBoxColumn Header="Operation1" ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" SelectedValueBinding="{Binding Operation1}" />
<DataGridComboBoxColumn Header="Operation2" ItemsSource="{Binding Source={StaticResource EnumDataProvider}}" SelectedValueBinding="{Binding Operation2}" />
</DataGrid.Columns>

</DataGrid>
<Button Grid.Row="1" Content="Ok" Click="Button_Click"/>
</Grid>
</Window>

关于c# - 数据表和 AutoGeneratedColummns 中带有枚举的 WPF DataGrid ="True",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28562781/

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