【问题标题】:XAML databinding to regular propertyXAML 数据绑定到常规属性
【发布时间】:2014-08-11 08:09:53
【问题描述】:

我目前正在 WPF/XAML 中试验数据绑定。我在 XAML 中编写了一个绑定到 PerspectiveCamera 的 TransformProperty 的相机控件,如下所示:

<PerspectiveCamera FieldOfView="60" UpDirection="0,1,0" Transform="{Binding
 CameraControlVM.CamControl.Transform}"/>

CameraControlVM 只是我的 ViewModel 类。 CamControl 有一个常规的 .Net 属性 Transform,在这里用作绑定源。

public class CameraControl 
{
    public Transform3D Transform { get; set; }
...
}

所以一切正常,但实际上我想知道为什么?!当我的相机控件的变换发生变化时,绑定透视相机的变换也会发生变化。在这种情况下,我将一个目标 (PerspectiveCamera.Transform) 绑定到作为源的常规属性 (Transform),它是一个 DependencyProperty。我还没有在我的 CameraControl 上实现 INotifyPropertyChanged 接口,所以在数据绑定方面,我希望只有相机控制转换应该被告知实际相机转换的变化,而不是相反。我是否在这里遗漏了什么或混淆了数据绑定规则?

为了让问题更清楚:在我的设置中,一个常规属性似乎会在没有使用 INotifyPropertyChanged 的​​情况下通知 DependencyProperty,我认为这在数据绑定中是不可能的,是吗? 也许它与从WPF中的Animatable派生的Transform3D有关?

【问题讨论】:

    标签: c# wpf data-binding


    【解决方案1】:

    让我试着消除​​混乱

    TransformCameraControl 类中的普通属性,因此更改属性的值不会触发任何通知,因此 UI 将无法响应

    另一方面,Transform 的类型是 Transform3D,它派生自 DependencyObject,因此能够通知实例内的任何属性更改。

    所以本质上是在运行时,如果您更改不会反映到 UI 的 Transform 属性的值

    例如。

    cam.Transform = new Transform3D();
    

    好像您修改了将反映到 UI 的 Transform3D 实例的属性

    例如。

    cam.Transform.Value = new Matrix3D();
    

    希望我能解开疑惑。

    【讨论】:

    • 谢谢。这才是重点。我实际上并没有通过调用它的 setter 或任何东西来更改 Transform 属性,但我正在更改它的内容(矩阵),这会反映到 UI。
    【解决方案2】:

    某些属性的 WPF 将 TwoWay 作为默认绑定模式(如 TextBox 控件中的 Text 属性),因此如果您想解决您的问题,可以尝试Mode=OneWay,如下所示:

    <PerspectiveCamera FieldOfView="60" UpDirection="0,1,0" Transform="{Binding
         CameraControlVM.CamControl.Transform, Mode=OneWay}"/>
    

    【讨论】:

    • 也许你误解了我的问题。它对我来说很好,但我不明白为什么,因为在我的设置中,一个常规属性似乎会在没有使用 INotifyPropertyChanged 的​​情况下通知 DependencyProperty,我认为这在数据绑定中是不可能的?!
    • 如果我把绑定到 OneWay 一切仍然正常,但我仍然不明白为什么。请在我的问题中查看上面的编辑。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多