我正在使用WPF开发应用程序,遵循使用MVVMLight的MVVM模式。我有一个ComboBox的问题,我不知道该如何解决。
ComboBox的ItemsSource由应用程序中的服务提供。通过绑定到VM的属性来设置SelectedValue:
<ComboBox ItemsSource="{Binding AllValues}" SelectedValue="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" DisplayMemberPath="Key" IsSynchronizedWithCurrentItem="True"/>
public ObservableCollection<ComboBoxValue> AllValues { get; set; }
public ComboBoxValue SelectedValue { get; set; }`enter code here`
如果我将VM中的SelectedValue
更新为AllValues
中存在的某个值,则一切正常,ComboBox选择被更新,SelectionChanged
事件被触发。但是,如果我将VM中的SelectedValue
设置为AllValues
中不存在的某个值,则ComboBox不会发生任何事情,不会触发任何事件,并且我找不到可以覆盖的方法来处理这种情况。最终结果是ComboBox仍显示旧值,与其绑定的属性值不同。
我想处理这个问题,并在发生这种情况时更改SelectedItem
的值。在VM中可以轻松完成此操作,但这不是处理此问题的合适位置。
答案 0 :(得分:0)
这就是ComboBox的工作方式。 SelectedValue
(和SelectedItem
)将包含项目列表中的值或null。
通过使ComboBox可编辑(IsEditable="True"
),然后将其Text
属性设置为所需的任何内容,就可以实现所需的目的。
如果列表中有Text
,则将选择该项目(因此将设置SelectedValue
)。您可以订阅TextInput
事件,以在Text
被修改时得到通知,然后检查它是否在列表中,并执行适当的操作。