2013-06-07 24 views
9

Ho creato un UserControl con alcune DependencyProperties (nell'esempio qui solo una proprietà stringa). Quando istanzio Usercontrol, posso impostare la proprietà di UserControl e viene visualizzato come previsto. Quando sto cercando di sostituire il testo statico con Binding, non viene visualizzato nulla.Associazione a UserControl DependencyProperty

mio UserControl si presenta come segue:

<User Control x:Class="TestUserControBinding.MyUserControl" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="30" d:DesignWidth="100"> 
    <Grid> 
    <Label Content="{Binding MyText}"/> 
    </Grid> 
</UserControl> 

codice dietro è:

namespace TestUserControBinding { 

    public partial class MyUserControl : UserControl { 
    public MyUserControl() { 
     InitializeComponent(); 
     this.DataContext = this; 
    } 

    public static readonly DependencyProperty MyTextProperty = 
        DependencyProperty.Register(
         "MyText", 
          typeof(string), 
          typeof(MyUserControl)); 

    public string MyText { 
     get { 
     return (string)GetValue(MyTextProperty); 
     } 
     set { 
     SetValue(MyTextProperty, value); 
     } 
    }// MyText 

    } 
} 

Quando provo questo nel mio MainWindow, tutto è come previsto:

<Window x:Class="TestUserControBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TestUserControBinding" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
    <local:MyUserControl MyText="Hello World!"/> 
    </StackPanel> 
</Window> 

Ma questo non funziona:

<Window x:Class="TestUserControBinding.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TestUserControBinding" 
     Title="MainWindow" Height="350" Width="525"> 
    <StackPanel> 
    <local:MyUserControl MyText="{Binding Path=Text}"/> 
    <Label Content="{Binding Path=Text}"/> 
    </StackPanel> 
</Window> 

Il comportamento del marchio è corretta, quindi non c'è alcun problema con il "testo" Proprietà

Qual è il mio errore? Medito per ore, ma non riesco a trovare nulla che ho dimenticato.

risposta

10

Con la seguente obbligatorio in vostro UserControl:

<Label Content="{Binding MyText}"/> 

io non sono sicuro di come impostare il testo direttamente alle opere di proprietà MyText. È necessario impostare DataContext su UserControl da qualche parte affinché funzioni.

Indipendentemente da ciò, questa associazione è il problema: poiché, a quanto ho capito, non si desidera associare lo DataContext dello UserControl perché non necessariamente avrà una proprietà MyText. Desideri eseguire il binding allo stesso UserControl e in particolare allo DependencyProperty che hai creato. Per fare questo, è necessario utilizzare un legame RelativeSource, come il seguente:

<Label Content="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}, Path=MyText}"/> 

Ciò navigare l'albero visivo per myUserControl e poi trovare la proprietà MyText lì. Non dipenderà dallo DataContext, che cambierà in base alla posizione in cui si posiziona lo UserControl.

In questo caso, local si riferisce a uno spazio dei nomi è necessario definire nel UserControl:

<UserControl x:Class="TestUserControBinding.MyUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:TestUserControBinding" 
     ...> 

E il tuo secondo esempio dovrebbe funzionare in quel punto.

+0

@Brian ... Il codice "this.DataContext = this;" dovrebbe occuparsi di impostare DataContext su local. Non dovrebbe? – Nishant

+4

Oh, sì, mi sono perso. Ma se stai creando un 'UserControl', non penso sia una buona idea impostare manualmente' DataContext'. Il 'DataContext' è destinato a rappresentare il contesto ereditato o assegnato dal contenitore. L'associazione 'RelativeSource' consente di ottenere il risultato desiderato (associazione a' DependencyProperty') senza interrompere il flusso ereditario 'DataContext' standard. Tentare di sovrascrivere il 'DataContext' come si avrà non riuscirà se l'utente del tuo' UserControl' imposta il proprio 'DataContext'. –

+2

quello era esattamente il problema.Invece di impostare DataContext di MyUserControl su se stesso ora uso 'x: Name =" MyName "' nel tag di apertura di 'MyUserControl' e il Binding cambia in:'

Problemi correlati