WPF / XAML - 允许ComboBox具有不在ItemsSource中的SelectedValue

时间:2012-05-18 20:20:31

标签: wpf xaml combobox

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

我需要一个WPF来做CRUD。 (创建,审核,更新,删除)。

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

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

当您查看或编辑客户类型值不在客户类型表中的客户记录时,会出现问题。这可能由于错误而发生,或者可能发生,因为customrtype已被弃用,并从表中删除。

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

如果您只是查看,则应该看到表中的值,无论它是否在列表中。如果你正在编辑,你可以提出一个合理的论据,你也应该显示表格中的值,至少在最初阶段,但是如果你改变了选择,你就无法得到你开始的东西。

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

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

虽然上面的答案是有效的,但在每种情况下都会产生相当数量的代码。这个问题作为一般模式存在,列表来自一个地方,所选值来自另一个地方。

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

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

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

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

我现在拥有的一些限制。它取决于能够将ItemsSource从对象转换为IList,并能够将每个项目从对象转换为我们可以从中获取字段值的已知基类。如果我绑定SelectedItem而不是SelectedValue,它就不起作用。

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