如何将不同的属性绑定到ComboBox的SelectedItem和SelectedIValue?

时间:2015-06-26 21:48:20

标签: c# wpf binding combobox

我有一个每秒更新当前IDOK属性的线程。我还想要一个选项,能够在datagrid中的同一个单元格中设置一个模式。因此,在编辑模式中,我只显示模式。在编辑模式下,我显示已填充的Mode。 现在,

  • 能够在ComboBox中显示所选项目,当我进入编辑模式时,我将ComboBox绑定到SelectedItem
  • 能够将更改返回到ViewModel,我将Mode绑定到另一个属性。 (我需要绑定到不同的属性,因为'Mode'每秒更新一次并覆盖所选的值。)

问题在于虽然SelectedValueSelectedItem绑定,但它仍会触发Mode=OneTime属性。我希望仅在用户选择值时触发SelectedValue

我希望我很清楚自己要做什么。那么,我怎么能做到这一点?其他方法也是受欢迎的(即使我需要使用不同的控件)。

SelectedValue

1 个答案:

答案 0 :(得分:0)

由于组合框的工作方式以及Mode在后​​台不断变化的方式,无法实现需要完成的前提。

为什么?

  

问题在于虽然SelectedItem与Mode = OneTime绑定   仍会触发SelectedValue属性。

应该如此。 {(1}}根据文档(BindingMode Enumeration)声明:

在应用程序启动时或数据上下文发生更改时更新绑定目标。

根据您的设计,数据上下文始终每秒更改一次。如果进一步阅读说明中的说明

如果您正在使用当前状态的快照适合使用或数据是真正静态的数据,则此类型的绑定是合适的。这实际上是OneWay绑定的一种更简单的形式。 ..

如果有人读到OneTime绑定

当绑定源(源)发生更改时更新绑定目标(目标)属性。如果绑定的控件是隐式只读的,则此类绑定是合适的。

组合框最终旨在更改OneWay并将SelectedItem的值移至SelectedItem

  

我希望只有在用户选择一个值时才会触发SelectedValue。

问题不在于控制,它正在进入......

创建一个测试项目,组合框的行为与您指定的方式相同,只有当用户选择一个值时才会触发选定的值。组合框仅在选择或外部值已更改时设置SelectedValue属性,以便更改另一个。

由于SelectedX不断变化,因此将更改推送到选择中,反之亦然。

建议修复

我建议您拍摄模式的快照并将其放入Mode变量并绑定它。当用户进行选择时,捕获事件并更改实际的ModeOnEdit

测试项目

绑定到您自己的数据源,我的是Ships。 Ships是一个列表,其中Mode作为该对象的属性。 ship对象上的Name返回ToString

结果是,有两个文本框显示所选项目/值的状态。用于设置所选值和组合框本身的按钮。

enter image description here

Name

- 背后的代码

<Label Grid.Row="1" Grid.Column="1">SelectedItem</Label>
<TextBlock Grid.Row="1" Grid.Column="2" Text="{Binding SelectedItem, ElementName=cbMain}"/>
<Label Grid.Row="3" Grid.Column="1" Grid.ColumnSpan="2">SelectedValue</Label>
<TextBlock Grid.Row="3" Grid.Column="2" Text="{Binding SelectedValue, ElementName=cbMain}"/>
<Button Grid.Row="5" Grid.Column="1" Click="ChangeSelectedValue">Set Selected Value</Button>
<ComboBox Name="cbMain"
            Grid.Row="5"
            Grid.Column="2"
            ItemsSource="{Binding Ships}"
            SelectedValuePath="Name"/>