我有一个每秒更新当前IDOK
属性的线程。我还想要一个选项,能够在datagrid中的同一个单元格中设置一个模式。因此,在不编辑模式中,我只显示模式。在编辑模式下,我显示已填充的Mode
。
现在,
ComboBox
中显示所选项目,当我进入编辑模式时,我将ComboBox
绑定到SelectedItem
。Mode
绑定到另一个属性。 (我需要绑定到不同的属性,因为'Mode'每秒更新一次并覆盖所选的值。)问题在于虽然SelectedValue
与SelectedItem
绑定,但它仍会触发Mode=OneTime
属性。我希望仅在用户选择值时触发SelectedValue
。
我希望我很清楚自己要做什么。那么,我怎么能做到这一点?其他方法也是受欢迎的(即使我需要使用不同的控件)。
SelectedValue
答案 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
。
结果是,有两个文本框显示所选项目/值的状态。用于设置所选值和组合框本身的按钮。
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"/>