让依赖对象属性可绑定为静态资源?

问题描述 投票:4回答:1

如何使依赖对象的属性数组可以绑定,以便以后作为静态资源绑定?

我现在的代码,好像是我的 DependencyObject 绕过了依赖属性系统......

我有以下类。

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的设置器 XAML会显示一个错误,说这个属性丢失了。我的理解是,XAML使用DP系统赋值从而实现绑定。在这种情况下,如果XAML期望一个 "正常 "属性,绑定是不可能的。谁能告诉我如何使它工作?

c# wpf xaml dependency-properties dependencyobject
1个回答
1
投票

这里不能绑定你的ValueMarkers的原因是。

1.它们不在你的windowusercontrol的VisualTree中.

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

因此,为了使你的ValueMarkers绑定到View 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是Windowsusercontrols DataContext中的属性。

那么你可以将这个资源作为。

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

同样,你也可以为其他ValueMarkers创建资源,以便在绑定中使用它们。

你不能通过创建x:Array来绑定,因为x:Array不在visualtree中,也不继承DataContext,因此它的元素也不能访问它。

如果你仍然想使用其元素应该支持绑定的集合,那么你需要创建你自己的集合类,该类应该继承Freezable并暴露DependancyProperty来捕获DataContext并将其设置在子元素上。

© www.soinside.com 2019 - 2024. All rights reserved.