【问题标题】:Binding to a field of a non-dependancy object绑定到非依赖对象的字段
【发布时间】:2012-02-14 13:31:43
【问题描述】:

在我的 .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 之前绑定,因为它为空,所以我无法从中读取正确的摩擦值物体。我尝试在 CurrentObject 的设置器中触发 Friction 属性更改,以在设置 CurrentObject 时填充 Friction,但这也不起作用。

好的,这里有两个要求:

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

我可能把事情弄得太复杂了,而且我一定遗漏了一些东西。在我上面的要求的限制内,最“正确”和“声明”的方式是什么?

谢谢, 可以。

【问题讨论】:

  • 您的输出窗口中是否出现任何绑定错误?您对控件的绑定是Value="{Binding Friction, ElementName=window, FallbackValue=0}" - 是引用控件的根,还是引用窗口?当您触发手动更改的 Friction 属性时会发生什么?
  • 不,我在输出中没有收到关于此绑定的任何绑定错误。是的,对不起,“窗口”是指控制根本身。这是我自己让事情变得更简单的约定,我只是使用“窗口”一词来命名根,无论它是控件还是窗口。
  • 创建实现 INPC 的包装器
  • 我能想到的唯一其他问题是:BindShapes 方法有什么作用?
  • @jberger 这是唯一的方法吗?如果是的话,把它变成一个答案,我会照着做的。

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


【解决方案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 的包装类。

【讨论】:

    猜你喜欢
    • 2020-08-06
    • 2013-12-30
    • 2013-02-10
    • 1970-01-01
    • 2016-01-06
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    相关资源
    最近更新 更多