Introduction
Today we are going to learn how we can use 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?
CodeProject