如何解决 lambda 表达式外部变量问题?

2023-12-14

我正在使用 PropertyDescriptor 和 ICustomTypeDescriptor (still)尝试将 WPF DataGrid 绑定到一个对象,该对象的数据存储在字典中。

因为如果您向 WPF DataGrid 传递一个 Dictionary 对象列表,它将根据字典的公共属性(比较器、计数、键和值)自动生成列,我的 Person 子类化了 Dictionary 并实现了 ICustomTypeDescriptor。

ICustomTypeDescriptor 定义了一个 GetProperties 方法,该方法返回 PropertyDescriptorCollection。

PropertyDescriptor 是抽象的,因此您必须对其进行子类化,我想我应该有一个构造函数,该构造函数采用 Func 和一个 Action 参数来委托字典中值的获取和设置。

然后,我为字典中的每个键创建一个 PersonPropertyDescriptor,如下所示:

            foreach (string s in this.Keys)
            {
                var descriptor = new PersonPropertyDescriptor(
                        s,
                        new Func<object>(() => { return this[s]; }),
                        new Action<object>(o => { this[s] = o; }));
                propList.Add(descriptor);
            }

问题是每个属性都有自己的 Func 和 Action 但它们都共享外部变量s因此,尽管 DataGrid 自动生成“ID”、“FirstName”、“LastName”、“Age”、“Gender”列,但它们都根据“Gender”获取和设置,这是最终的静态值s在 foreach 循环中。

如何确保每个委托使用所需的字典 Key,即实例化 Func/Action 时 s 的值?

多谢。


这是我的其余想法,我只是在这里进行实验,这些不是“真正的”课程......

// DataGrid binds to a People instance
public class People : List<Person>
{
    public People()
    {
        this.Add(new Person());
    }
}

public class Person : Dictionary<string, object>, ICustomTypeDescriptor
{
    private static PropertyDescriptorCollection descriptors;

    public Person()
    {
        this["ID"] = "201203";
        this["FirstName"] = "Bud";
        this["LastName"] = "Tree";
        this["Age"] = 99;
        this["Gender"] = "M";        
    }        

    //... other ICustomTypeDescriptor members...

    public PropertyDescriptorCollection GetProperties()
    {
        if (descriptors == null)
        {
            var propList = new List<PropertyDescriptor>();

            foreach (string s in this.Keys)
            {
                var descriptor = new PersonPropertyDescriptor(
                        s,
                        new Func<object>(() => { return this[s]; }),
                        new Action<object>(o => { this[s] = o; }));
                propList.Add(descriptor);
            }

            descriptors = new PropertyDescriptorCollection(propList.ToArray());
        }

        return descriptors;
    }

    //... other other ICustomTypeDescriptor members...

}

public class PersonPropertyDescriptor : PropertyDescriptor
{
    private Func<object> getFunc;
    private Action<object> setAction;

    public PersonPropertyDescriptor(string name, Func<object> getFunc, Action<object> setAction)
        : base(name, null)
    {
        this.getFunc = getFunc;
        this.setAction = setAction;
    }

    // other ... PropertyDescriptor members...

    public override object GetValue(object component)
    {
        return getFunc();
    }

    public override void SetValue(object component, object value)
    {
        setAction(value);
    }
}

Simply:

        foreach (string s in this.Keys)
        {
            string copy = s;
            var descriptor = new PersonPropertyDescriptor(
                    copy,
                    new Func<object>(() => { return this[copy]; }),
                    new Action<object>(o => { this[copy] = o; }));
            propList.Add(descriptor);
        }

有了捕获的变量,它就在它所在的地方declared这很重要。因此,通过在循环内声明捕获的变量,您可以在每次迭代中获得捕获类的不同实例(循环变量,s,技术上声明outside循环)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决 lambda 表达式外部变量问题? 的相关文章

  • 如何在 Visual Studio 2010 中增强 XAML 设计器?

    当我使用 XAML 设计器时 进入设计器和退出设计器是如此困难和缓慢 当我这样做时 Visual Studio 卡了一段时间 有什么方法可以增强 XAML 设计器和编辑器吗 Ant 保存 XAML 文件时非常慢 这通常意味着您可能有复杂的
  • 如何在 C++ 中的文件末尾添加数据?

    我已按照网上的说明进行操作 此代码应该将输入添加到文件 数据库 的末尾 但当我检查时 数据会覆盖现有数据 请帮忙 这是我的代码 int main string name string address string handphone cou
  • 在 C# 中创建具有单独列的分隔文本

    我一直在尝试在 C 中创建一个制表符限制的文本文件 以便数据正确显示在单独的列中 Firstname Lastname Age John Smith 17 James Sawyer 31 我尝试过 t 字符 但我得到的只是 Firstnam
  • VB.NET 相当于 C# 属性简写吗?

    是否有与 C 等效的 VB NET public string FirstName get set 我知道你能做到 Public Property name As String Get Return name ToString End Ge
  • 向 Nhibernate 发出 SQL 查询

    如何将此 SQL 查询发送给 Nhibernate SELECT Customer name FROM Company INNER JOIN Customer ON Company CompanyId Customer CompanyId
  • 如何将 #ifdef DEBUG 添加到 Xcode?

    我的项目中有一些代码永远不应该在发布版本中使用 但在测试时很有用 我想做这样的事情 ifdef DEBUG Run my debugging only code endif 在 Xcode 4 中哪里添加 DEBUG 设置 我尝试将其放入
  • 如何修复此错误“GDI+ 中发生一般错误”?

    从默认名称打开图像并以默认名称保存 覆盖它 我需要从 Image Default jpg 制作图形 将其放在 picturebox1 image 上并在 picurebox1 上绘制一些图形 它有效 这不是我的问题 但我无法保存 pictu
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • C# Dns.GetHostEntry 不返回连接到 WiFi 的移动设备的名称

    我有一个 C 中的 Windows 窗体应用程序 我试图获取列表中所有客户端的主机名 下面给出的是 ra00l 来自此链接的代码示例 GetHostEntry 非常慢 https stackoverflow com questions 99
  • 无法在 Windows 运行时组件库的 UserControl 中创建依赖项属性

    我想在用户控件内创建数据可绑定属性 这个用户控件包含一个 Windows 运行时组件 项目 我使用下面的代码来创建属性 public MyItem CurrentItem get return MyItem GetValue Current
  • ASP.NET:获取自 1970 年 1 月 1 日以来的毫秒数

    我有一个 ASP NET VB NET 日期 我试图获取自 1970 年 1 月 1 日以来的毫秒数 我尝试在 MSDN 中寻找方法 但找不到任何东西 有谁知道如何做到这一点 从 NET 4 6 开始 该方法ToUnixTimeMillis
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 如何在 Blackberry Cascades 中显示具有特定号码的电话板

    我正在使用带有 C QT 和 QML 的 Blackberry Cascades 10 Beta 3 SDK 以及 Blackberry 10 Dev Alpha Simulator 和 QNX Momentics IDE 并且我正在尝试实
  • std::async 与重载函数

    可能的重复 std bind 重载解析 https stackoverflow com questions 4159487 stdbind overload resolution 考虑以下 C 示例 class A public int f
  • 如何从main方法调用业务对象类?

    我已将代码分为业务对象 访问层 如下所示 void Main Business object public class ExpenseBO public void MakeExpense ExpensePayload payload var
  • (de)从 CSV 序列化为对象(或者最好是类型对象的列表)

    我是一名 C 程序员 试图学习 C 似乎有一些内置的对象序列化 但我在这里有点不知所措 我被要求将测试数据从 CSV 文件加载到对象集合中 CSV 比 xml 更受青睐 因为它更简单且更易于人类阅读 我们正在创建测试数据来运行单元测试 该集
  • C++ 密码屏蔽

    我正在编写一个代码来接收密码输入 下面是我的代码 程序运行良好 但问题是除了数字和字母字符之外的其他键也被读取 例如删除 插入等 我知道如何避免它吗 特q string pw char c while c 13 Loop until Ent
  • 线程和 fork()。我该如何处理呢? [复制]

    这个问题在这里已经有答案了 可能的重复 多线程程序中的fork https stackoverflow com questions 1235516 fork in multi threaded program 如果我有一个使用 fork 的
  • 防止在工厂方法之外实例化对象

    假设我有一个带有工厂方法的类 class A public static A newA Some code logging return new A 是否可以使用 a 来阻止此类对象的实例化new 那么工厂方法是创建对象实例的唯一方法吗 当

随机推荐

  • Bluemix Spark-submit — 如何保护我的 Scala jar 所需的凭据

    我有一个 Spark 应用程序 正在将其提交到 Bluemix Spark Cluster 它从 DASHDB 数据库读取并将结果写入 Cloudant 该代码使用 Spark 和 JDBC 访问 DASHDB DASHDB 数据库的用户
  • 从 XML 生成 C# 类

    我可以从 XML 文件生成 C 类吗 如果您正在 VS 2012 或更高版本 中处理 NET 4 5 项目 您可以特殊浆料您的 XML 文件作为类 将 XML 文件的内容复制到剪贴板 在编辑器中 选择要粘贴类的位置 从菜单中选择EDIT g
  • 在 bash 脚本中运行 PostgreSQL CLI (psql) 时没有密码提示?

    以用户 postgres 身份通过 bash 脚本运行 PostgreSQL CLI psql 会导致发送密码提示 即使我可以在没有密码的情况下手动运行它 当我尝试在脚本中添加 w 时 出现此错误 psql fe sendauth 未提供密
  • DEP0600 部署 UWP 项目时出错

    Visual Studio 社区 2015 更新 3 在部署带有蓝屏的 UWP 项目时崩溃 意外的存储异常 以前发生过这种情况 后 我无法再部署任何项目 我尝试使用 VS 崩溃的项目 该项目的先前版本以及完全空的新项目 错误信息如下 DEP
  • Matlab-将连续数据转换为离散数据

    是否有任何技术可用于将连续数据转换为离散数据 我所说的连续数据是指各种函数生成的输出值 例如 为不同数据点集的熵生成的值 如果是这样 Mathworks File Exchange 的 Matlab 中是否有可用的实现 更准确的答案是您需要
  • 自定义 Android 应用程序屏幕图像,在应用程序屏幕之间切换时可见

    我想知道当我的应用程序处于后台模式时 如何将我的应用程序的图像自定义为主屏幕图像 即当用户在最近的应用程序选项中的应用程序之间导航时 所有正在运行的应用程序的小屏幕截图都可见 Eg Image Attached for more clari
  • ios 和 android 上的字体大小不同

    在 Android 上的 Web 视图中 我加载一个包含 HTML5 画布的 html 文件 将文本写入画布时 它非常小 如果我在 PC 浏览器甚至 IOS 上的 Web 视图中加载相同的 html 文件 它看起来是正确的 据我所知 我已经
  • git 中的上游/主题/集成之间的合并方向是否有重要意义?

    我已阅读使用git打包软件直到我的眼睛酸痛为止 正如我所看到的这个图片 建议从上游 gt 主题分支 gt 本地集成分支进行合并 我对上游分支和本地集成分支之间存在冲突的场景特别感兴趣 如果我完全正确地阅读了这篇文章 它说如果我合并上游 gt
  • 产生给定总和和乘积的子数组

    给定一个长度为N的数组 如何找到最小长度 其和为 S 其乘积为 P 的连续子数组 例如5 6 1 4 6 2 9 7 for S 17 Ans 6 2 9 for P 24 Ans 4 6 从左到右 将所有数字相加 如果总和 gt S 则丢
  • 我可以在我的 wpf 应用程序中嵌入 ICE 并与其交互触发事件吗

    我可以将 ICE 嵌入到我的 wpf 应用程序中并与其触发事件进行交互吗 例如我可以通过编程方式填写表格并按提交按钮吗 下面是 WPF Web 浏览器控件的链接 该控件不是 WPF 初始版本的一部分 是在 3 5 SP1 中添加的 只要您的
  • 如何在 SQL Server 中自动更新相关视图?

    我们公司的某人决定使用 3 个视图来支持网页 并且它们必须包含相同的列子集 所以我有这样的定义 CREATE VIEW EmailReceivedView AS SELECT dbo EmailReceived ID lots of col
  • andengine中的自定义ScrollView

    我怎样才能定制ScrollView这会移动所有的侧面 我如何找到我点击 ScrollView 的位置andengine 提前致谢 我编写了一个小的 ShapeScrollContainer java 类 该类正在开发中 但功能齐全 欢迎您使
  • 创建将子对象嵌套在猫鼬中的对象父对象

    我想创建 1 个对象嵌套文档 例如 孩子们 chil1 name Mimi parent 537258f63eb92b3201b65e56
  • React-router导入路由

    我想改变这一点
  • 在c中清除输入缓冲区的替代方法

    有没有其他方法可以在不使用c的情况下清除输入缓冲区 fflush or while getchar n 因为我到处都读过它 但找不到任何其他方法来做到这一点 最好的解决方案是不要太依赖输入缓冲区的状态 使用整行读取输入fgets 然后解析它
  • 步数进度条ExtJs

    How I can implement a step progress bar in ExtJs like this 您可以在帮助下创建步骤进度条dataview 并编写简单的接口来使您的组件与此同步dataview Fiddle
  • AWS Cognito 登录 (Android)

    我正在尝试弄清楚如何使用 AWS Cognito 登录用户 这教程所有这些似乎都是从注册用户的角度来处理用户的 而不是让他们登录 我不希望用户经历注册过程 这将由我们的办公室用户在其他地方完成 我只想在这个应用程序中提供一个流程 让他们输入
  • 将矩阵保存到文件时如何控制格式?

    我将矩阵保存到如下文件中 save filepath mtrx ascii 有没有办法告诉MATLAB写0代替0 0000000e 000价值观 这会很好 因为可以更快 更容易地看出哪些值不同于零 我建议使用DLMWRITE代替SAVE因为
  • 我如何在 iOS 中读取 ptr_refs 给出的引用?

    打印参考文献列表时ptr refs 它给出了一些模糊的结果 至少在 iOS 中 例如 我有一个带有这个小应用程序的示例应用程序ViewController类和恰好一个对 a 的出口引用UILabel实例 import UIKit class
  • 如何解决 lambda 表达式外部变量问题?

    我正在使用 PropertyDescriptor 和 ICustomTypeDescriptor still 尝试将 WPF DataGrid 绑定到一个对象 该对象的数据存储在字典中 因为如果您向 WPF DataGrid 传递一个 Di