Use dataBinding and DependencyProperty with a non-WPF or extern object
10 April 2009Today we are going to learn how we can uses the powerful data binding of WPF even on non-WPF objects.
The problem: when to use this solution ?
Sometimes you need to use the databinding with an object that you have not created and you can't use inheritance.
For example I wanted to use a Mogre Camera and build some WPF animation with it and I couldn't because :
- WPF animation needed a DependencyProperty to manipulate,
- I couldn't derive the Mogre.Camera class and add it the correct things because I got the camera from a factory object (the sceneManager).
Then I couldn't use the WPF animation to move my camera... next is how I solve it.
A solution: mine and surely not the best 
Here is the solution i use:
- Create a proxy DependencyProperty inside a DependencyObject, for example your main windows.
- Override the OnPropertyChanged handler.
- Update the aimed attribute inside the handler.
To control my camera, I created this DependencyProperty inside my windows:
public static readonly DependencyProperty CameraPositionProperty = DependencyProperty.Register("CameraPosition", typeof(Point3D), typeof(SurfaceWindow1), new PropertyMetadata(new Point3D(0, 0, 0))); public Point3D CameraPosition { get { return (Point3D)GetValue(CameraPositionProperty); } set { SetValue(CameraPositionProperty, value); } }
Then I added this override :
protected override void OnPropertyChanged(DependencyPropertyChangedEventArgs e) { base.OnPropertyChanged(e); if (e.Property.Name.Equals("CameraPosition")) { _ogre.Camera.SetPosition((float)((Point3D)e.NewValue).X, (float)((Point3D)e.NewValue).Y, (float)((Point3D)e.NewValue).Z); _ogre.Camera.LookAt(Vector3.ZERO); } }
And my usual question :
Does someone have a better idea to perform the same ?
- By JonathanANTOINE@falsemail.com
- - WPF
- - Tags :
Comments
I used similar solution. The problem is that when you call _ogre.Camera.SetPosition from code, the CameraPosition is not updated. The other direction works thanks to the OnPropertyChanged handler.
@Inv : Strange, it works fine for me, but happy to help you
!