Название немного размыто, я не нашел способа сказать это более четко.
Давайте рассмотрим простой и очень понятный пример моей ситуации:
Первый: у меня есть пользовательский элемент управления FooControl
с DependencyProperty
типа IFoo
. Элемент управления должен отображать IFoo
объектов в DataGrid
Обратите внимание, что, конечно, реальный объект не просто отображает некоторые значения, я мог бы использовать только DataGrid для этого вопроса;)
public class FooControl : DataGrid
{
/// <summary>
/// Foo!
/// </summary>
public static readonly DependencyProperty FooProperty =
DependencyProperty.Register("Foo",
typeof(IFoo),
typeof(FooControl),
new PropertyMetadata(FooChanged));
Второе: у меня IFoo
интерфейс
public interface IFoo
{
IList<double> Values { get; set; }
}
Третье: у меня есть Foo
объект, реализующий IFoo
public class Foo : IFoo
{
public IList<double> Values { get; set; }
}
А теперь я хочу ObservableFoo
, для привязки обновлений, вот оно:
public class ObservableFoo : Foo, INotifyCollectionChanged
{
public ObservableCollection<double> ObservableValues {get; set; }
}
Теперь ПРОБЛЕМА:
У меня обычно FooControl
привязаны к объектам типа Foo
, которые являются "строгими" реализациями интерфейса IFoo
.
Теперь мне также нужно иметь три FooControl
s, которые должны быть привязаны к объектам типа ObservableFoo
(которые, очевидно, IFoo
, но также добавить свойство, не указанное в интерфейсе, то есть ObservableValues
)
в классе FooControl
я вручную установил привязку к отображаемым значениям:
/// <summary>
/// Sets the binding on foo values
/// </summary>
/// <param name="propertyPath">Binding path</param>
public void SetValuesBinding(string propertyPath)
{
// Binding for foovalues
Binding fooBinding = new Binding(propertyPath);
fooBinding.Converter = new FooConverter();
fooBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
fooBinding.RelativeSource = new RelativeSource(RelativeSourceMode.Self);
fooBinding.Mode = BindingMode.TwoWay;
this.SetBinding(FooControl.ItemsSourceProperty, fooBinding);
}
Когда propertyPath
равен Foo.Values
, он работает нормально, обновление цели привязки вызовет PropertyChangedHandler
, который я определил для ItemsSource
Когда propertyPath
равно Foo.ObservableValues
, обновление привязки не вызовет PropertyChangedHandler
, который я определил. Однако в окне вывода не отображается ошибка привязки!
В моем понимании проблемы это означает, что:
- Переплет "сработал", т.е. найдено исходное свойство
- НО, поскольку
ObservableValues
не в IFoo
, а только в ObservableFoo
, привязка пытается найти IFoo.ObservableValues
и ... не может его обновить.
Как мне удалось обновить привязку до ObservableValues
?
Надеюсь, я достаточно ясно дал вам понять, ребята. Пожалуйста, не стесняйтесь задавать любые вопросы, если вам нужно, чтобы я уточнить