我目前正在试验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有关?
答案 0 :(得分:2)
让我试着清除混乱
Transform
是CameraControl
类中的普通属性,因此更改属性的值不会触发任何通知,因此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}"/>