当SelectedValuePath使用的属性更新时,ComboBox SelectedValue不更新

时间:2018-08-25 19:48:25

标签: wpf binding

我的目标是,如果所选配置文件更改其绑定value,则绑定属性Name将更新为正确的值。现在,它保留了旧值,该值打破了序列化/反序列化的绑定。

我的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

我的可选配置文件集合;

ObservableCollection<Profile> profiles = new ObservableCollection<Profile>();

我的个人资料类;

public partial class Profile: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public string Name
    {
        get { return _name; }
        set { if (value != _name) { _name = value; PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Name")); } }
    }
    private string _name = "[Default]";
}

INotify似乎工作得很好,因为当名称更改时,组合框中显示的Name会针对列出的所有配置文件进行更新。但是在序列化时,绑定到名为value的SelectedValue的prop不包含Name的新值。

1 个答案:

答案 0 :(得分:0)

您是正确的。看来SelectedValue仅在ComboBox中的选择更改时才更新,并且更改Name并不会实际更改当前选择,因此不会更新。您可以改为将SelectedItem绑定到属性。那将包含更新的名称。任何控件都将绑定到SelectedItem.Name而不是Value

如果必须使用SelectedValue,则可以取消选择并重新选择comboBox的选择(糟糕!),或者只要对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 ();