【发布时间】:2011-05-21 03:10:40
【问题描述】:
我有一个场景,我将提供一个简单的例子来帮助说明。
假设我正在编写一个类似 CheckBox 的自定义控件,该控件能够在特定事件触发时被选中。该事件可以是诸如 MouseEnter 之类的任何事件,或者甚至可能是其他一些非 UI 事件,例如当网络连接断开时。关键是在某些时候我需要手动设置绑定源的值。
我的假设是这种类型的功能必须是可能的,以便像 TextBox 这样的控件能够工作,因为它们可以以允许 Text 属性根据键盘输入的内容更新为值但无需清除的方式进行操作我存在于 Text 属性上的任何绑定。所以我试图找到实现这一目标的基本方法。
尝试#1
如下所示设置绑定的目标属性(例如 IsChecked)将导致绑定被清除。所以这个选项不起作用(更正!见下面的my answer)。
this.IsChecked = true;
或者:
this.SetValue(CheckBox.IsCheckedProperty, true);
尝试#2
BindingBase 类有一个名为 ProvideValue 的属性,如 MSDN documentation 中所述,“返回一个对象,该对象应在应用此绑定和扩展的属性上设置。”这听起来很有希望,所以我尝试通过以下两种方式实现我自己的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 });
到目前为止,我还没有运气,所以如果有人能提供一些指点,我将不胜感激。
【问题讨论】:
标签: data-binding binding dependency-properties