2011-04-28 13 views
10

tengo esta propiedad Text dependencia en código detrás:databind de XAML al código detrás

public static DependencyProperty TextProperty = 
     DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), 
     new PropertyMetadata("Hello world")); 

public string Text { 
    get { return (string)GetValue(TextProperty); } 
    set { SetValue(TextProperty, value); } 
} 

que desea enlazar el contenido de la etiqueta a que Text propiedad para que la etiqueta se muestra el valor real de la propiedad Text y vice- versa.

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

¿Cómo puedo hacerlo?

Lo he hecho hace algún tiempo pero ahora no recuerdo cómo, y es muy simple. El código más simple será aceptado.

+0

He intentado esto: '

Respuesta

14

Conjunto DataContext de la ventana/de control a la misma clase y luego especificar la ruta en la unión, algo como esto:

public class MyWindow : Window { 

    public MyWindow() { 
     InitializeComponents(); 
     DataContext = this; 
    } 

    public string Text { ... }  
} 

Luego en su xaml:

<Label Content="{Binding Path=Text}"> 
+0

Funciona gracias. Pero ¿por qué no muestra el contenido de 'Label's en el diseñador de VS? – drasto

+0

Al configurar DataContext desde código subyacente, blend no mostrará datos vinculados al contexto de datos. Puede usar d: DataContext para establecer el contexto de datos de tiempo de diseño a otro objeto que facilita el diseño en blend. Vea aquí: http://stackoverflow.com/questions/862829/what-is-the-advantage-of-setting-datacontext-in-code-instead-of-xaml –

+0

No lo quiero en Blend pero en VisualStudio . Es lo mismo ? – drasto

9

Tiene que establecer el DataContext de la ventana para que funcione. XAML:

<Window x:Class="WpfApplication2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
    <Grid> 
     <StackPanel> 
     <Label Content="{Binding Text}" /> 
     <Button Content="Click me" Click="HandleClick" /> 
     </StackPanel> 

    </Grid> 
</Window> 

de código subyacente:

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), new PropertyMetadata("Hello world")); 
    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { this.SetValue(TextProperty, value); } 
    } 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    protected void HandleClick(object sender, RoutedEventArgs e) 
    { 
     this.Text = "Hello, World"; 
    } 
} 
+0

-1 Copiar pegó su código para proyectar y no funciona. – drasto

+2

Malo, olvidé el DataContext. Probar ahora. Lo siento. (Lo probé y funciona.) –

+0

+1 Mejor, pero otros fueron más rápidos, antes de que pudieras editar. Gracias por el buen ejemplo de todos modos será útil para otros. – drasto

1

Cuando dices que está en el código subyacente, ¿te refieres a que está en el código de la ventana de tu clase?

Es posible que desee vincular a RelativeSource donde el tipo de antecesor es Ventana. Alternativamente, si su contexto de datos no está ya configurado, en su evento Load, configure la propiedad DataContext de la ventana en la ventana misma (esto), y simplemente use {Binding Text}.

+0

yes code-behind significa que la 'Label' está en la misma clase que la propiedad de dependencia' Text'. La única diferencia aquí es que 'Label' está en XAML y la propiedad de dependencia en el código. – drasto

+0

Trabajos. Gracias. – drasto

0

Configuración DataContext en XAML de código subyacente puede ser un poco complicado pero en general estas situaciones son las más comunes:

  1. ¿Quieres hacer el DataContext el conjunto Ventana o personalizada control de usuario

.

<Window 
blahhhh.. 
DataContext={Binding RelativeSource={RelativeSource Mode=Self}}> 

o

<UserControl 
Blahhhh.... 
DataContext={Binding RelativeSource={RelativeSource Mode=Self}}> 

2.Si se establece la DataContext de la ventana o control de usuario a otra cosa que el código detrás y tienen un control secundario que tendría que establecer que es DataContext al código subyacente puede utilizar lo siguiente:

<Label DataContext={Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=Window}}/> 

por encargo control de usuario:

<Label DataContext={Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType=UserControl}}/> 

en este ajuste, el DataContext a la libre Caso, hará encuadernación se refieren al mismo objeto de etiqueta que no es el Código de Control-Detrás. Espero que le ayudará.

Cuestiones relacionadas