Wpf 更新SelectedValuePath使用的属性时,ComboBox SelectedValue不会更新
我的目标是,如果选定的配置文件更改了其Wpf 更新SelectedValuePath使用的属性时,ComboBox SelectedValue不会更新,wpf,binding,Wpf,Binding,我的目标是,如果选定的配置文件更改了其名称,则使绑定属性值更新为正确的值。现在,它维护旧值,该值在序列化/反序列化时中断绑定 我的XAML <ComboBox SelectedValue="{Binding value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="120" SelectedValuePath="Name" ItemsSource="{Binding Profiles}, Mode=OneWay}
名称
,则使绑定属性值
更新为正确的值。现在,它维护旧值,该值在序列化/反序列化时中断绑定
我的XAML
<ComboBox SelectedValue="{Binding value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" MinWidth="120" SelectedValuePath="Name" ItemsSource="{Binding Profiles}, Mode=OneWay}">
<ComboBox.ItemTemplate>
<DataTemplate DataType="{x:Type local:Profile}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox
INotify似乎工作正常,因为组合框中显示的
Name
会在名称更改时更新列出的任何配置文件。但是序列化时,绑定到SelectedValue(称为value
的prop不包含Name
的新值,您是正确的。看起来,SelectedValue
仅在组合框中的选择更改时更新,更改名称实际上不会更改当前选择,因此不会更新。您可以将SelectedItem
绑定到属性。将包含更新的名称。任何控件都将绑定到SelectedItem.Name
,而不是Value
如果必须使用SelectedValue,则可以取消选择并重新选择组合框的选择(糟糕!),或者在更改Name属性时强制更新SelectedValue,例如:
if (comboBox1.SelectedItem != null) {
if (!comboBox1.SelectedValue.Equals(((Profile) comboBox1.SelectedItem).Name)) {
comboBox1.SelectedValue = ((Profile) comboBox1.SelectedItem).Name;
}
}
再说一次,虽然不是很漂亮,但很管用。可能有一种方法可以获取SelectedValue的BindingExpression
并强制更新,但只要在其上调用UpdateSource
,似乎什么都做不了,除非选择已更改
comboBox1.GetBindingExpression (ComboBox.SelectedValueProperty).UpdateSource ();
if (comboBox1.SelectedItem != null) {
if (!comboBox1.SelectedValue.Equals(((Profile) comboBox1.SelectedItem).Name)) {
comboBox1.SelectedValue = ((Profile) comboBox1.SelectedItem).Name;
}
}
comboBox1.GetBindingExpression (ComboBox.SelectedValueProperty).UpdateSource ();