Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将不同的属性绑定到ComboBox的SelectedItem和SelectEdValue?_C#_Wpf_Binding_Combobox - Fatal编程技术网

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,我将
    SelectedValue
    绑定到不同的属性。(我需要绑定到不同的属性,因为“Mode”每秒更新一次,并将覆盖选定的值)
问题在于,尽管
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";
}