У меня есть сценарий, для которого я предложу простой пример, чтобы проиллюстрировать это.
Допустим, я пишу пользовательский элемент управления в стиле CheckBox, который может быть проверен при возникновении определенного события. Событие может быть любым, например MouseEnter, или даже каким-либо другим событием, не относящимся к пользовательскому интерфейсу, например, когда разрывается сетевое соединение. Дело в том, что в какой-то момент мне нужно вручную установить значение в источнике привязки.
Я предполагаю, что этот тип функциональности должен быть возможен для того, чтобы элементы управления, такие как TextBox, работали, поскольку они могут работать таким образом, чтобы свойство Text могло обновляться до значений, основанных на том, что печатает клавиатура, но без очистки любая привязка, которая может существовать в свойстве Text. Поэтому я пытаюсь найти основной способ добиться этого.
Попытка # 1
Установка целевого свойства привязки (например, IsChecked), как показано ниже, приведет к очистке привязки. Так что эта опция не будет работать (ИСПРАВЛЕНИЕ! См. мой ответ ниже).
this.IsChecked = true;
или альтернативно:
this.SetValue(CheckBox.IsCheckedProperty, true);
Попытка # 2
Класс BindingBase имеет свойство ProvideValue, которое, как описано в документации MSDN «Возвращает объект, который должен быть установлен в свойстве, где применяются эта привязка и расширение». Это звучит многообещающе, поэтому я попытался реализовать свой собственный IServiceProvider двумя способами, показанными ниже.
Реализация A:
public class CheckProvider : IServiceProvider
{
public object Value { get; set; }
public object GetService(Type serviceType)
{
return Value;
}
}
Реализация B:
public class CheckProvider : IServiceProvider
{
public object Value { get; set; }
public object GetService(Type serviceType)
{
return new ObjectProvider() { TargetObject = new TempDependencyObject() { IsSelected = Value }, TargetProperty = TempDependencyObject.IsSelectedProperty };
}
public class TempDependencyObject : DependencyObject
{
public object IsSelected
{
get { return (object)GetValue(IsSelectedProperty); }
set { SetValue(IsSelectedProperty, value); }
}
public static readonly DependencyProperty IsSelectedProperty =
DependencyProperty.Register("IsSelected", typeof(object), typeof(TempDependencyObject));
}
public class ObjectProvider : System.Windows.Markup.IProvideValueTarget
{
public object TargetObject { get; set; }
public object TargetProperty { get; set; }
}
}
А вот как я пытаюсь вручную обновить источник привязки, используя эти классы.
myControl.DataContext = obj;
myBinding.ProvideValue(new CheckProvider() { Value = true });
Пока мне не повезло, поэтому, если бы кто-то мог предложить несколько указателей, это было бы очень признательно.