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 ();