我的目标是,如果所选配置文件更改其绑定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
的新值。
答案 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 ();