5

所以,我有一个客户表,包含客户记录,记录,每个记录都有一个customertype 字段。我还有一个 customertype 表,其中包含 customertype 字段的有效值。

我需要一个 WPF 来做 CRUD。(创建、查看、更新、删除)。

显而易见的解决方案是使用 ComboBox,其 SelectedValue 属性绑定到 customertype 字段,其 ItemsSource 属性绑定到由 customertype 表的查询填充的列表。

问题是,除了你在练习中看到的那种简单问题之外,这不起作用。

当您查看或编辑具有不在 customertype 表中的 customertype 值的客户记录时,就会出现困难。这可能是错误发生的,也可能是因为 customertype 已被弃用并从表中删除。

在这种情况下,WPF 所做的是将 customertype 字段设置为 null,因为 SelectedValue 不在 ItemsSource 列表中。这是一个问题。

如果您只是查看,您应该看到表中的值,无论它是否在列表中。如果您正在编辑,您可以提出一个合理的论点,即您也应该显示表中的值,至少最初是这样,但如果您更改选择,您将无法获得您开始的内容。

那么,有什么想法吗?这是一个几乎在我拥有的每个编辑/查看表单上都会出现的问题,所以我更喜欢在使用时相当干净的东西。(也就是说,考虑到 XAML 中的复杂性选择,我需要处理这些字段之一的每个地方,或者支持我插入的 XAML 以处理这些字段之一的代码中的复杂性,我更喜欢后者。)

4

2 回答 2

3

为此,我建议不要将您的 ItemsSource 直接绑定到 CustomerType 表的内容。相反,合并 Customer Type 表中 Customer Type 项目的 ItemsSource 以及存储在 Customer 记录中但 Customer Type 表中不存在的所有 CustomerType 值。一旦用户从查看进入编辑,更新集合以仅使用 CustomerType 表中的那些项目。当用户进入查看模式时,切换回合并的集合。

于 2012-05-18T20:27:07.483 回答
0

虽然上面的答案有用,但它在每种情况下都产生了大量的代码。并且这个问题作为一般模式存在,列表来自一个地方而所选值来自另一个地方的任何地方。

我还没有决定解决方案,但我最近的尝试显示了希望。

我所做的是从 ComboBox 派生一个新类。为此,我添加了一个新的 DependencyProperty - AddSelectedIfMissing。然后我重写 OnItemsChanged()。在其中,我检查 SelectedValue 是否与 ItemsSource 中任何项目的 SelectedValuePath 字段匹配。

我将 ItemsSource 绑定到 viewmodel 的属性,该属性返回代表有效选择的记录对象集合。我将 SelectedValue 绑定到包含现有值的视图模型的属性。我将 AddSelectedIfMissing 绑定到视图模型的布尔属性,当我想将 SelectedValue 添加到 ItemsSource 时,该属性为真。

当我从视图更改为编辑时,我在绑定到 ItemsSource 的属性上引发 PropertyChanged,因此控件将重新加载它。

我现在所拥有的有一些限制。这取决于能否将 ItemsSource 从 object 转换为 IList,并且能够将每个 item 从 object 转换为我们可以从中获取字段值的已知基类。如果我绑定 SelectedItem 而不是 SelectedValue,它就行不通。

但在这些限制范围内,它运行良好。

于 2012-05-24T18:40:43.020 回答