XAML数据绑定到常规属性

时间:2014-06-20 14:20:24

标签: c# wpf data-binding

我目前正在试验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更改WITHOUT时通知DependencyProperty并且我认为这在数据绑定中是不可能的,是吗? 也许它与从WPF中的Animatable派生的Transform3D有关?

2 个答案:

答案 0 :(得分:2)

让我试着清除混乱

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

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

因此,在运行时,如果更改不会反映到UI

的Transform属性的值,则实质上是这样

例如。

cam.Transform = new Transform3D();

其中就像修改将反映到UI

的Transform3D实例的属性一样

例如

cam.Transform.Value = new Matrix3D();

我希望我能够清除这种困惑。

答案 1 :(得分:0)

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

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