0

早上好,

我有一组动态的方法,它们都具有相同的返回类型ResultSet。我有 UI 来显示一个ResultSet,所以剩下的就是提供一个用于参数化方法的 UI。例如我可能有以下方法;

public ResultSet FindNew (DateTime date, int id)
public ResultSet FindOld (DateTime date, int id)
public ResultSet FindMerged (DateTime date, int[] id)
public ResultSet FindNew (DateTime date, string name)

我想使用反射在类中提供具有正确返回类型的所有方法的下拉列表。选择后,我想生成参数化方法所需的输入表单。然后,用户应该能够提交查询并查看结果或被告知发生的错误。

我认为我可以使用我对 C# 的知识以一种天真的方式实现此功能,但我希望 WPF 的某些功能可能对我的探索有所帮助。

编辑

抱歉这个问题太宽泛了。

鉴于您IEnumerableParameterInfo[]如何在您的视图中绑定到 this 以创建一个表单,以便用户可以为每个参数输入一个值?

特别是尽可能不破坏 MVVM。我能看到的问题是;

  • 将 ParameterInfo 渲染为 Label 和与其类型相关的数据输入组件
  • 将数据输入组件绑定到 ViewModel 中的某些内容,以便可以使用该值

目前我正在考虑使用 ParameterInfo 的自定义类型或元组以及该参数的当前值。然后我可以使用 DataTemplates 来显示正确的数据输入组件(DatePicker Vs. TextBox Vs. ComboBox)。

注意在 winforms 中,这是通过PropertyGrid实现的,有一个开源 WPF 项目试图实现相同的目标,但由于项目在依赖项方面的限制,我宁愿使用我自己的实现。

4

2 回答 2

1

如果您的问题是:

  1. 提供了具有相似返回类型的函数列表(列表可能会被修改)
  2. 为每个函数中的参数类型构造一个有效的输入控件(或输入控件的集合)
  3. 将这些输入控件中收集的值传递回对每个函数的调用
  4. 显示每个函数的结果

你可能在这里看到了太多的动态主义。您可以在代码中构建控件(这可能不是您想要的,因为您指定了绑定),或者您可以考虑以下算法(如果每个函数只有一个参数):

  1. 对于每个函数,构造一个对象。它必须有许多布尔属性,每个属性都映射到每种类型的输入控件。例如,UseCheckBox, UseNumericSpinner, UseIntArray, 在任何时候最多可以有一个属性为真,等等。或者您可以使用一个 Enum 属性。这些属性显然应该基于函数的参数类型。
  2. 在您的 XAML 中,您创建一个主项容器来包含函数
  3. 创建一个包含所有可能类型的输入控件(数字微调器、日期选择器、文本框、滑块等)的用户控件
  4. 将此用户控件放入主项目控件的数据模板中
  5. 将每个输入控件的可见性绑定到适当的布尔属性(例如 CheckBox.Visibility 应该绑定到 UseCheckBox)。您可能需要使用自定义转换器将布尔值转换为 Visilbility 值。或者,如果您使用的是枚举属性,请绑定到枚举值。
  6. 将对象列表绑定到项目控件的数据上下文

在此方法中,当您将对象列表绑定到项目控件时,它将创建一个用户控件列表,每个功能一个。在每个用户控件中,绑定会自动确保只有一个输入控件可见。

于 2011-03-22T10:55:46.880 回答
0

根本不清楚你想要什么。您想根据一组函数的参数动态创建输入控件吗?

如果是这样的话,我会怎么做:

  1. 根据每种参数类型定义一个类。
  2. 这些类都应该实现一个接口或从一个基类继承,该基类具有一个指示要创建的控件类型的方法。
  3. 您的 IEnumerable 应包含这些类的列表
  4. 您可以通过循环遍历这些类并根据每种类型实例化一个新的输入控件来动态创建控件,或者
  5. 您将集合绑定到项目容器元素的 DataContext 并且元素的项目模板应该包含一个复合用户控件,其中包含所有可能形式的输入控件,但根据 type 参数,在任何时候只有一个可见;用户控件的值应该是可见输入控件的值
  6. 当您从所有这些输入控件中获取值时,将它们传递回接受对象的通用抽象 Find 方法,但在每个类的覆盖实现中进行类型检查
于 2011-03-22T09:35:43.903 回答