【问题标题】:Binding on inherited Dependency Property绑定继承的依赖属性
【发布时间】:2013-09-13 08:49:02
【问题描述】:

我有一个可继承的附加属性:

public static readonly DependencyProperty ResourcePackageProperty =
            DependencyProperty.RegisterAttached("ResourcePackage", typeof(IResourcePackage), typeof(ResourceUIElement),
                                                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));

在容器控件上,我设置了这个附加属性 => 后代控件继承了这个,到目前为止还不错。

现在我尝试定义这样的绑定:

var binding = new Binding();
binding.Source = proxy;
binding.Mode = BindingMode.OneWayToSource;
binding.Path = new PropertyPath("Value");
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(childControl, ResourceUIElement.ResourcePackageProperty, binding);

这应该会在 childControl 的 ResourcePackage 属性发生变化时更新 proxy 对象的 Value 属性。 p>

这在我直接在子控件上设置附加属性时有效,但在容器控件上更改附加属性时它不起作用(因此,被继承到 childControl).

使用 WPF 的依赖属性系统是否可以做到这一点?

【问题讨论】:

  • 请注意,您不是在完整的类上设置绑定,而是在实例上设置绑定。因此,如果您希望您的代理值在您的容器控件中的 AP 发生更改时更改,您需要设置另一个绑定,将您的容器控件作为目标。
  • 我这样理解:childControl-instance 从 containercontrol-instance 派生 AP => 因此,我认为更改 containercontrol 上的 AP 也会更改子控件上的 AP(因为它们派生它)并且绑定将被触发。如果不是这种情况,我将无能为力 - 创建绑定的代码不知道哪个祖先控件设置了 AP。
  • 通过派生您只是“复制”类方法、道具等,但您从这些类构建的实例没有连接。因此,更改基类实例的属性对派生类的实例没有影响。但是让我告诉你:总有一种方法,不要放弃;)你可以,例如,向你的 childControl 添加一个名为 ContainerControl 的属性,当子控件添加到容器控件时会设置该属性。
  • 我不明白这个问题。请您发布更多代码。

标签: c# wpf data-binding dependency-properties


【解决方案1】:

现在我找到了解决方案:

var binding = new Binding();
binding.Source = childControl;
binding.Mode = BindingMode.OneWay;
binding.Path = new PropertyPath("(0)", ResourceUIElement.ResourcePackageProperty);
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(proxy, Proxy.ValueProperty, binding);

将绑定转向相反的方向有效。以前是 OneWayToSource,现在 Proxy 类是从 DependencyObject 派生的,绑定是 OneWay。

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多