如何将依赖对象属性作为静态资源绑定?

4
如何使依赖对象属性的数组可绑定,以便稍后作为静态资源进行绑定?
我现在拥有的代码似乎绕过了依赖属性系统...
我有以下类:
public class ValueMarker : DependencyObject
{
    public static readonly DependencyProperty BrushProperty = DependencyProperty.Register("Brush", typeof(Brush), typeof(ValueMarker), new FrameworkPropertyMetadata(Brushes.Aqua));
    public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(double), typeof(ValueMarker), new FrameworkPropertyMetadata(0d));
    public static readonly DependencyProperty OffsetProperty = DependencyProperty.Register("Offset", typeof(double), typeof(ValueMarker), new FrameworkPropertyMetadata(0d));

    public Brush Brush
    {
        get { return (Brush)GetValue(BrushProperty); }
        set { SetValue(BrushProperty, value); }
    }

    public double Offset
    {
        get { return (double)GetValue(OffsetProperty); }
        set { SetValue(OffsetProperty, value); }
    }

    public double Value
    {
        get { return (double)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }
}

在XAML中,我创建了一个包含这些资源数组的绑定。
        <x:Array Type="my:ValueMarker" x:Key="plainMarks">
            <my:ValueMarker Brush="Red" Offset="-5" Value="{Binding Path=...}" />
            <my:ValueMarker Brush="Orange" Offset="-5" Value="{Binding Path=...}"/>
            <my:ValueMarker Brush="Orange" Offset="-5" Value="{Binding Path=...}"/>
            <my:ValueMarker Brush="Red" Offset="-5" Value="{Binding Path=...}" />
        </x:Array>

在调试绑定时,我注意到如果我删除DP的setter,则XAML将显示一个错误,说这个属性丢失了。我的理解是,XAML使用DP系统来分配值,从而实现绑定。在这种情况下,如果XAML期望一个“普通”的属性,绑定是不可能的。有谁能告诉我如何使它正常工作?
1个回答

3

您无法在此处绑定ValueMarkers的原因是:

1.它们不在窗口/用户控件的VisualTree中。

2.即使它们不是Visual Tree的一部分,它们也不是可以继承DataContext的对象类型。

因此,为了使您的ValueMarkers绑定到视图DataContext中的属性,首先您必须从Freezable类派生它们,例如下面所示:

 public class ValueMarker : Freezable
    {
        //All your Dependency Properties comes here//

        protected override Freezable CreateInstanceCore()
        {
            return new ValueMarker();
        }
    }

完成后,您可以像下面这样简单绑定您的对象:

完成此操作后,您只需按以下方式绑定您的对象:

   <my:ValueMarker x:Key="vm1" Brush="Orange" Offset="-5" Value="{Binding Path=Text1}"/>

这里的Text1是Windows/usercontrols DataContext中的属性。

然后你可以将其用作资源:

  <TextBox Text="{Binding Value, Source={StaticResource vm1}, StringFormat=F2}"/>

同样地,您可以创建其他ValueMarker的资源并在绑定中使用它们。但是,如果仅创建x:Array,则无法进行绑定,因为它不在可视树中且不继承DataContext,因此其元素也无法访问它。
如果您仍想使用支持绑定的元素的集合,则需要创建自己的集合类,该类应继承Freezable并公开DependancyProperty以捕获DataContext,并在子元素上设置它。

谢谢您的回复。这个信息让我重新考虑了我的设计,并且我还发现了绑定代理方法,所以我想我会采用这种方法。 - John K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接