用字典 <String,MyClass> 在 C# 中填充 WPF DataGrid

Posted

技术标签:

【中文标题】用字典 <String,MyClass> 在 C# 中填充 WPF DataGrid【英文标题】:Filling WPF DataGrid in C# with a Dictionary <String,MyClass> 【发布时间】:2022-01-12 22:56:03 【问题描述】:

我想用我的字典中的数据填充数据网格。绑定列 Binding="Binding Key 有效,但尝试绑定 MyClass 的值 (Binding="Binding Value.myString) 我只获得未找到的属性'目的'。我应该改变什么? 提前致谢。

【问题讨论】:

【参考方案1】:

我可以给你一个样品。

请看以下代码:

xaml:
Binding="Binding MyclassDic[N_100].Id"

cs:
xxx.Binding=new Binding(@"MyclassDic[N_100].Id");

MainWindow.xaml:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="197" Width="514.5"
        Loaded="Window_Loaded">
    <Grid RenderTransformOrigin="0.5,0.5" Margin="0,0,-1,3">
        <Grid.RenderTransform>
            <TransformGroup>
                <ScaleTransform/>
                <SkewTransform/>
                <RotateTransform Angle="0.338"/>
                <TranslateTransform/>
            </TransformGroup>
        </Grid.RenderTransform>
        <DataGrid Name="DataGrid" AutoGenerateColumns="False" >
            <DataGrid.Columns>
                <DataGridTextColumn Header="Id" Width="150" Binding="Binding MyclassDic[N_100].Id" />
                <DataGridTextColumn Header="Name" Width="150" Binding="Binding MyclassDic[N_100].Name" />
                <DataGridTextColumn Header="Age" Width="150" Binding="Binding MyclassDic[N_100].Age" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

MainWindow.xaml.cs:

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

namespace WpfApp1 
    public partial class MainWindow : Window 
        public MainWindow () 
            InitializeComponent();
            

        private void Window_Loaded (object sender, RoutedEventArgs e) 
            List<Project> projects = new List<Project>();
            Project project = new Project();
            project.MyclassDic.Add("N_100", new Myclass(1, "Tim", 30));
            projects.Add(project);
            DataGrid.ItemsSource = projects;              
            
        
    

Myclass.cs:

using System;
namespace WpfApp1 
    public class Myclass
        
        public int Id 
            get; set;
            
        public String Name 
            get; set;
            
        public int Age 
            get; set;
            

        public Myclass (int Id,String Name, int Age) 
            this.Name = Name;
            this.Id = Id;
            this.Age = Age;
            
        
    

项目.cs:

using System;
using System.Collections.Generic;

namespace WpfApp1 
    public class Project 
        public Dictionary<String, Myclass> MyclassDic 
            get; set;
            
        public Project () 
            MyclassDic = new Dictionary<String, Myclass>();
            
        
    

输出:

【讨论】:

好的,我明白这一点,但在 MainWindow.xaml 中,您的目标是特定项目 (N_100)。如何显示字典中的所有项目?它是从服务器加载的,每次应用打开时数据都会发生变化。 这个结构有点特殊,能否介绍一下你的代码结构?我可以进一步帮助你。 我从 firesharp Dictionary 中得到。 MyClass 包含除 ID 之外的所有数据,我需要将其与 MyClass 中的字符串一起显示。有没有办法避免在里面只为 ID 和 MyClass 创建另一个数据持有者? “另一个数据持有者”是什么意思?你最好使用ObservalbleCollection 我通过将其设置为 ObservableCollection 找到了 workarund,但使用了包含 MyClass 和 ID 的新类。它有效,但增加了数据结构的复杂性,这是我试图避免的。无论如何感谢您的帮助:)

以上是关于用字典 <String,MyClass> 在 C# 中填充 WPF DataGrid的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中获得类似`MyClass<String>.class`的东西

使用键和值约束扩展字典

从对象转换 List<MyClass> 返回 System.InvalidCastException C# [重复]

kotlin委托属性

字典Dictionary

问一下list<>中的问题?