2010-02-17 24 views
8

Tengo un UserControl de WPF que contiene una DependencyProperty personalizada denominada MyDP. Quiero vincular esto a una propiedad en mi ViewModel (que se inyecta como el DataContext del UserControl). Yo sé una manera de hacerlo mediante el establecimiento de la unión en la declaración del control de usuario en XAML de la ventana padre como tal:Configuración del enlace a una DependencyProperty personalizada dentro de un control de usuario de WPF

<Window x:Class="MyNamespace.Views.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:views="clr-namespace:MyNamespace.Views"> 
    <StackPanel> 
     <views:MyControl MyDP="{Binding Path=MyVMProperty, Mode=OneWayToSource}"/> 
    </StackPanel> 
</Window> 

Esto funciona bien, pero como una alternativa podría Puedo establecer la unión en el interior XAML del control de usuario, similar ¿Cómo configuro los enlaces para los controles individuales dentro del UserControl a otras propiedades del ViewModel?

Respuesta

15

No puede hacer lo que pensaba originalmente. Probablemente lo intentó y obtuvo algunos errores de compilación. No puede establecer una propiedad personalizada en línea en el XAML raíz de UserControl porque el tipo de elemento es UserControl, por lo que el compilador impone nombres de propiedad basados ​​en ese tipo, no su tipo personalizado. Puede evitar esto cambiando a una propiedad adjunta, pero eso realmente cambia el significado de MyDP. En su lugar, puede establecer un valor predeterminado en el Estilo para UserControl y obtener un beneficio adicional de poder anularlo en cualquier instancia declarada simplemente haciendo lo que está en su ejemplo original. Establecer este escalón de la raíz de su control de usuario:

<UserControl.Style> 
    <Style> 
     <Setter Property="views:MyControl.MyDp" Value="{Binding Path=MyVMProperty, Mode=OneWayToSource}" /> 
    </Style> 
</UserControl.Style> 
+0

Eso funcionó perfectamente, gracias! No es el enfoque más obvio para este novato de WPF, pero tu explicación ciertamente aclara la situación. –

+0

Gracias. También funcionó bien para mí, aunque noté que quería vincular el CU al contexto de datos, por lo que OneTime era el modo correcto para mí. – GarethJ

+0

Muy útil. Gracias. – tronious

1

También podría definir la unión en el constructor de MainWindow, así:

public MainWindow() 
{ 
    InitializeComponent(); 
    SetBinding(MyDPProperty, "MyVMProperty"); 
} 
Cuestiones relacionadas