Это происходит потому, что для привязок TwoWay WPF обнаруживает только когда свойство получает новое значение, а не когда объект, на который ссылается свойство, изменяется.
В вашем случае ваша собственность содержит коллекцию ObservableCollection, созданную вашим конвертером. Хотя содержимое ObservableCollection было изменено и оно запускает INotifyPropertyChanged, само свойство привязки не изменилось: оно по-прежнему ссылается на тот же ObservableCollection, что и раньше. Из-за этого WPF DataBinding не запускается и ваш источник не обновляется.
Когда вы вызываете UpdateSource () вручную, он заставляет ObservableCollection проходить через ваш конвертер и обратно к вашему объекту данных, поэтому он работает.
Самый простой способ получить желаемое поведение:
Вместо привязки к полю данных, привязка к объекту данных и извлечение нужного поля в конвертере (если вы хотите создать универсальный конвертер, который может получить доступ к любому полю, передайте поле в качестве параметра) .
В преобразователе при создании ObservableCollection добавьте событие CollectionChanged, которое обновляет исходный объект при каждом его запуске.
Вот общая идея в коде:
public MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
PropertyInfo property = object.GetType().GetProperty((string)parameter);
var coll = BinaryToCollection((Binary)property.GetValue(object, null));
coll.CollectionChanged += (sender, e) =>
{
property.SetValue(object, CollectionToBinary(coll));
};
return coll;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
private ObservableCollection<SomeType> BinaryToCollection(Binary data)
{
// conversion details here
}
private Binary CollectionToBinary(ObservableCollection<SomeType> coll)
{
// conversion details here
}
}
В этом случае ваша привязка изменится с
<ItemsControl ItemsSource="{Binding something.property, Mode=TwoWay, Converter={...}}"
до
<ItemsControl ItemsSource="{Binding something, Converter={...}}"
с параметром преобразователя, являющимся именем свойства
Надеюсь, это поможет!