WPF/XAML-允许ComboBox具有非';项目来源中的t

WPF/XAML-允许ComboBox具有非';项目来源中的t,wpf,xaml,combobox,Wpf,Xaml,Combobox,所以,我有一个customer表,包含customer记录,record,每个记录都有一个customertype字段。我还有一个customertype表,其中包含customertype字段的有效值 我需要一个WPF来做积垢。(创建、审阅、更新、删除) 显而易见的解决方案是使用组合框,将其SelectedValue属性绑定到customertype字段,将其ItemsSource属性绑定到由customertype表的查询填充的列表 问题是,除了你在练习中看到的那种简单问题,这不起作用 在查

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

我需要一个WPF来做积垢。(创建、审阅、更新、删除)

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

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

在查看或编辑customertype表中不包含customertype值的客户记录时,会出现困难。这可能是错误造成的,也可能是因为customertype已被弃用并从表中删除

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

如果只是查看,则应该看到表中的值,而不管它是否在列表中。如果您正在编辑,您可以提出一个合理的论点,即您还应该显示表中的值,至少在开始时是这样,尽管如果您更改了选择,您无法获得您开始使用的值


有什么想法吗?这是我拥有的几乎所有编辑/视图表单上都会出现的问题,因此我更喜欢在使用时比较干净的表单。(也就是说,如果选择XAML中的复杂度,我需要处理其中一个字段,或者选择支持XAML的代码中的复杂度来处理其中一个字段,我更喜欢后者。)

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

虽然上面的答案有效,但在每个实例中都会产生相当数量的代码。这个问题作为一个通用模式存在,任何地方的列表来自一个地方,而选择的值来自另一个地方

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

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

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

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

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


但在这些限制范围内,它工作得很好。

我正在尝试,但它不太工作。组合框的ItemsSource后面的代码现在插入当前customerid,如果它不在从数据库返回的内容中,如果我们正在查看现有记录。但是如果我更改为编辑一条新记录,我将在ItemsSource属性上引发PropertyChanged,在调试器中我可以看到调用的代码,以及构建的新列表,其中不包括额外的值,但在UI中,我仍然看到第一个列表。您是否尝试过在列表集合更改时使用ObservaleCollection作为您的ItemsSource或InotifyProperty更改?我只是有点困惑。我不是在筹款我以为我是在筹款。你能发布你的代码吗?我意识到这是一个老问题,但我有一个类似的问题,我会对此感兴趣。