2012-08-16 13 views
13

estoy tratando de unir varias propiedades diferentes en mi Xaml:¿Cómo me uno a RelativeSource Self?

<Label Content="{Binding Description}" 
Visibility="{Binding Path=DescriptionVisibility, 
ElementName=_UserInputOutput}"    
FontSize="{Binding Path=FontSizeValue, ElementName=_UserInputOutput}" 
HorizontalAlignment="Left" VerticalAlignment="Top" Padding="0" /> 

Usted notado que he utilizado dos diferentes técnicas de unión aquí. Los que usan Nombre de elemento funcionan, el otro no. Aquí está el código detrás:

public string Description 
{ 
    get { return (string)GetValue(DescriptionProperty); } 
    set { SetValue(DescriptionProperty, value); } 
} 
public static readonly DependencyProperty DescriptionProperty = 
DependencyProperty.Register("Description", typeof(string), typeof(UserControl), 
new UIPropertyMetadata("")); 

Cada encuadernación tiene un nombre diferente, pero todos se ven así en su mayor parte. Quiero que mi unión a ser capaz de trabajar con:

{Binding Description} 

En lugar de:

{Binding Path=Description, ElementName=_UserInputOutput} 

Sólo parece estar funcionando cuando se utiliza ElementName. Necesito exportar/importar este XAML, por lo que no puedo tener un ElementName o la importación no funcionará.

pensé que esto sería lo mejor:

{Binding Path=Description, RelativeSource={RelativeSource Self}} 

Esto no funcionó.

¿Alguna idea? ¡Gracias!

+0

[Este artículo] (http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/30/debugging-data-bindings-in-a-wpf-or-silverlight-application.aspx) podría ser de interés. –

Respuesta

26

No ha configurado DataContext, que es lo que RelativeSource está usando para determinar en qué se relaciona. Necesita configurar el DataContext en un nivel superior, como UserControl. Normalmente tengo:

<UserControl ... DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
</UserControl> 

Esto le dice al UserControl que se vincule con la clase en el código subyacente.

+0

Eres increíble !!!!!! Woo hoo! ¡Funciona! –

+12

"que es lo que RelativeSource usa para determinar en qué se relaciona". Esa afirmación es completamente incorrecta. También establecer el DataContext de un UserControl rara vez es una buena idea ... –

+2

Creo que esta no es una buena idea, ya que viola el paradigma de MVVM: cuando queremos usar WPF con MVVM tenemos una vista que se une a su ViewModel. Entonces dentro del constructor del código detrás de la Vista decimos 'View() {InitializeComponent(); DataContext = new ViewModel(); } ' Esto hace que todas las operaciones de enlace de datos funcionen en ViewModel para que podamos separar la vista de ViewModel. – codingdave

29

{RelativeSource Self} objetivos del objeto que posee la propiedad que se está obligado, si tienes un ejemplo de unión en un Label buscará Label.Description, que no está allí. En su lugar, debe usar {RelativeSource AncestorType=UserControl}.

enlaces sin una fuente (ElementName, Source, RelativeSource) son en relación con la DataContext, sin embargo, en que debiera UserControlsavoid setting the DataContext que no se metan con los enlaces externos.

Cuestiones relacionadas