绑定到非依赖对象的字段

时间:2012-02-14 13:31:43

标签: wpf binding .net-4.0 dependency-properties

在我的.NET 4.0项目中,我有一个具有公共字段的对象,该对象既不实现INotifyPropertyChanged也不继承DependencyObject,它永远不会。但是,我需要一种机制来“绑定”我的WPF控件中的此对象的字段。我知道我不能直接这样做,因为绑定需要依赖属性(或至少属性和通知属性更改),所以我该怎么做才能实现我需要的绑定功能。我在WPF控件中尝试过类似的东西:

    void FirePropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public float Friction
    {
        get
        {
            if (CurrentObject != null)
            {
                return CurrentObject.Friction;
            }
            else
            {
                return 0.0f;
            }
        }
        set
        {
            if (CurrentObject != null)
            {
                CurrentObject.Friction = value;
                FirePropertyChanged("Friction");
            }
        }
    }

    public PlatformObjectTemplate CurrentObject
    {
        get
        {
            return GetValue(CurrentObjectProperty) as PlatformObjectTemplate;
        }
        set
        {
            SetValue(CurrentObjectProperty, value);
            FirePropertyChanged("Friction");
            FirePropertyChanged("CurrentObject");
            BindShapes();
            IntersectionComboBox.SelectedItem = CurrentObject.IntersectionStaticMethod;
        }
    }

    public static readonly DependencyProperty CurrentObjectProperty = DependencyProperty.Register("CurrentObject", typeof(PlatformObjectTemplate), typeof(PlatformStaticObjectPropertyEditor), new PropertyMetadata(null));

我的WPF控件实现了INotifyPropertyChanged,而我的PlatformObjectTemplate没有属性,只有Friction等公共字段。我需要在XAML中绑定到我的对象:

(在我的控件中):// DoubleUpDown来自WPF工具包。

<tk:DoubleUpDown Margin="91,10,7,0" Name="doubleUpDown1" VerticalAlignment="Top" Value="{Binding Friction, ElementName=window, FallbackValue=0}" />

(在我的主窗口中):

<my:PlatformStaticObjectPropertyEditor x:Name="platformStaticObjectPropertyEditor1" CurrentObject="{Binding CurrentObject, ElementName=window}" />

我在Friction属性的getter中放了一个断点,它尝试绑定绑定CurrentObject之前,因为它是null,我无法读取正确的摩擦来自对象的价值。我试图触发在CurrentObject的setter中更改的Friction属性,以便在设置CurrentObject时填充Friction,但这也不起作用。

好的,这有两个要求:

PlatformObjectTemplate使用属性。它将有公共领域。 我像往常一样需要一种声明性的绑定方式,就像我在上面的XAML中使用的那样。

我可能有过于复杂的事情,我一定会错过一些东西。在上述要求的限制范围内,这种做法最“正确”和“声明”的方式是什么?

谢谢, 可以。

1 个答案:

答案 0 :(得分:1)

object neither implements INotifyPropertyChanged nor inherits DependencyObject, and it will never. However, I need a mechanism to "bind" to fields of this object in my WPF control

poyra,我有同样的情况。因为无法绑定到实例字段,所以最好选择创建实现INotifyPropertyChanged的包装类。