C# 如何将不同的属性绑定到ComboBox的SelectedItem和SelectEdValue?
我有一个线程每秒更新当前的C# 如何将不同的属性绑定到ComboBox的SelectedItem和SelectEdValue?,c#,wpf,binding,combobox,C#,Wpf,Binding,Combobox,我有一个线程每秒更新当前的模式属性。我还希望有一个选项能够在datagrid中的同一单元格内设置模式。因此,在非编辑模式下,我只显示模式。在编辑模式下,我显示一个填充的组合框。 现在, 为了能够在组合框中显示所选项目,当我进入编辑模式时,我将SelectedItem绑定到模式 为了能够将更改恢复到ViewModel,我将SelectedValue绑定到不同的属性。(我需要绑定到不同的属性,因为“Mode”每秒更新一次,并将覆盖选定的值) 问题在于,尽管SelectedItem与Mode=On
模式
属性。我还希望有一个选项能够在datagrid中的同一单元格内设置模式。因此,在非编辑模式下,我只显示模式。在编辑模式下,我显示一个填充的组合框
。
现在,
- 为了能够在
中显示所选项目,当我进入编辑模式时,我将组合框
绑定到SelectedItem
模式
- 为了能够将更改恢复到ViewModel,我将
绑定到不同的属性。(我需要绑定到不同的属性,因为“Mode”每秒更新一次,并将覆盖选定的值)SelectedValue
SelectedItem
与Mode=OneTime
绑定,但它仍然会触发SelectedValue
属性。我希望仅当用户选择值时才会触发SelectedValue
我希望我想做的事情很清楚。那么,我怎样才能做到这一点呢?欢迎使用其他方法(即使我需要使用不同的控件)
由于组合框的工作方式以及
模式在后台不断变化,因此无法实现需要执行的操作的前提
为什么?
问题是,尽管SelectedItem与Mode=OneTime绑定,但它
仍然触发SelectedValue属性
应该如此<代码>一次性
根据文档()说明:
“在应用程序启动或数据上下文更改时更新绑定目标。”
根据您的设计,数据上下文始终每秒更改一次。如果一个人读得更深入,他说
“如果您使用的数据适合使用当前状态的快照,或者数据是真正静态的,则这种类型的绑定是合适的……这本质上是一种简单的单向绑定形式……”
如果你读到单向的绑定
“当绑定源(源)更改时更新绑定目标(目标)属性。如果要绑定的控件是隐式只读的,则此类型的绑定是合适的。”
组合框的最终目的是更改SelectedItem
,并将SelectedItem
的值转换为SelectedValue
我希望仅当用户选择值时才会触发SelectedValue
问题并不是失控,而是即将发生的事情
创建一个测试项目,组合框的行为与您指定的方式相同,仅当用户选择一个值时才会触发选定值。当做出选择时,组合框仅设置所选的属性,或者外部值更改了一个属性,从而更改了另一个属性
由于模式
不断变化,因此它将变化推到选择中,而不是反过来
修复建议
我建议您拍摄模式的快照,并将其放入ModeOnEdit
变量中并绑定该变量。当用户做出选择时,捕获事件并更改实际的模式
测试项目
绑定到你自己的数据源,我的是船。Ships是一个列表,其中和Name
作为该对象的属性<在ship对象上的code>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"/>
至少对我来说,还不清楚为什么
StatusToSet
在实际用户选择之前必须保持(null)?当发生SelectionChange
事件时,为什么不将选择推送到另一个属性?由于StatusToSet
具有不需要的中间值?@OmegaMan,它应该是ModeToSet
(我已经更新了它)。在CellEditingTemplate
中执行SelectedItem=“{Binding Mode}”
操作时,将更新源代码。我不想在您刚进入编辑模式时更新它。我考虑了您的评论,添加了附加属性ModeToTest
,解决了问题<代码>
<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"/>
private void ChangeSelectedValue(object sender, RoutedEventArgs e)
{
cbMain.SelectedValue = "Pacific Silver";
}