Error al vincular una propiedad de dependencia en un comportamiento personalizado

Estoy explorando el mecanismo de comportamiento adjunto de Silverlight para usar el patrón Model-View-ViewModel dentro de mis aplicaciones Silverlight. Para empezar, estoy tratando de hacer funcionar un simple Hello World, pero estoy completamente atascado en un error por el cual no puedo encontrar una solución.

Lo que tengo ahora es una página que solo contiene un botón que debería mostrar un mensaje cuando se hace clic. El evento de clic se maneja utilizando una clase derivada de Comportamiento, y el mensaje se especifica como una propiedad de dependencia del comportamiento en sí. El problema surge cuando se trata de vincular la propiedad del mensaje a una propiedad en una clase de modelo de vista utilizada como contexto de datos: obtengo una excepción en la llamada aInitializeComponent en la vista

Aquí está todo el código que estoy usando, como pueden ver, es bastante simple. Primero el marcado de la página principal y la vista que contiene:


Mi página

<UserControl x:Class="MyExample.MyPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:MyExample"
    >
    <Grid x:Name="LayoutRoot">
        <local:MyView/>
    </Grid>
</UserControl>


Mi vista (El TextBlock está ahí solo para verificar que la sintaxis de enlace es correcta)

<UserControl x:Class="MyExample.MyView"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:local="clr-namespace:MyExample"
    Width="400" Height="300">
    <StackPanel Orientation="Vertical" x:Name="LayoutRoot" Background="White">
        <StackPanel.Resources>
            <local:MyViewmodel x:Key="MyResource"/>
        </StackPanel.Resources>
        <TextBlock Text="This button will display the following message:"/>
        <TextBlock Text="{Binding MyMessage, Source={StaticResource MyResource}}" FontStyle="Italic"/>
        <Button x:Name="MyButton" Content="Click me!">
            <i:Interaction.Behaviors>
                <local:MyBehavior Message="{Binding MyMessage, Source={StaticResource MyResource}}"/>
            </i:Interaction.Behaviors>
        </Button>
    </StackPanel>
</UserControl>


Ahora el código, hay dos clases: una para el comportamiento y otra para el modelo de vista:

MyViewmodel

public class MyViewmodel
{
    public string MyMessage
    {
        get { return "Hello, world!"; }
    }
}


Mi comportamiento

public class MyBehavior : Behavior<Button>
{
    public static readonly DependencyProperty MessageProperty =
        DependencyProperty.Register("Message",
        typeof(string), typeof(MyBehavior),
        new PropertyMetadata("(no message)"));

    public string Message
    {
        get { return (string)GetValue(MessageProperty); }
        set { SetValue(MessageProperty, value); }
    }

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Click += new RoutedEventHandler(AssociatedObject_Click);
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.Click -= new RoutedEventHandler(AssociatedObject_Click);
    }

    void AssociatedObject_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show(Message);
    }
}


Bastante simple, pero este código lanza unAG_E_PARSER_BAD_PROPERTY_VALUE [Line: 15 Position: 43] (justo al comienzo del valor que se establece para la propiedad Message) excepción cuando se ejecuta. Estoy seguro de que me estoy perdiendo algo, pero ¿qué?

Información adicional: si elimino el enlace de la propiedad Message en MyBehavior (es decir, si establezco su valor en cualquier cadena estática), funciona bien. Además, estoy apuntando a Silverlight 3 RTW.

¡Muchas gracias!


ACTUALIZAR

Parece que, a diferencia de WPF, Silverlight no admite el enlace de datos en ningún objeto derivado de DependencyObject, pero solo en objetos derivados de FrameworkElement. Este no es el caso del comportamiento, por lo tanto, el enlace no funciona.

He encontrado una soluciónaquí, en forma de algo llamado carpetas sustitutas. Básicamente, usted especifica el elemento y la propiedad a enlazar, así como el valor, como atributos de FrameworkElement que contiene el objeto que no es FrameworkElement.


ACTUALIZACIÓN 2

La carpeta sustituta no funciona cuando FrameworkElement contiene un subelemento Interaction.Behaviors.

He encontrado otra solucionaquí, y este parece funcionar. Esta vez, el truco utilizado es unDeepSetter. Define uno de dichos definidores como un recurso estático en el StackPanel que contiene y luego hace referencia al recurso del comportamiento. Entonces, en mi ejemplo, deberíamos expandir la sección de recursos StackPanel de la siguiente manera:

<StackPanel.Resources>
    <local:MyViewmodel x:Key="MyResource"/>
    <local:DeepSetter 
        x:Key="MyBehaviorSetter"
        TargetProperty="Message"
        BindingExport="{Binding MyMessage, Source={StaticResource MyResource}}"/>
</StackPanel.Resources>

... y modifique la declaración de comportamiento del botón de la siguiente manera:

<local:MyBehavior local:DeepSetter.BindingImport="{StaticResource MyBehaviorSetter}"/>

ACTUALIZACIÓN 3

Buenas noticias: el enlace de datos para cualquier DependecyObject estará disponible en Silverlight 4:http://timheuer.com/blog/archive/2009/11/18/whats-new-in-silverlight-4-complete-guide-new-features.aspx#dobind

Respuestas a la pregunta(1)

Su respuesta a la pregunta