2010-02-23 16 views
21

Estoy intentando que el contenido de una etiqueta se vincule a la propiedad de cadena de una instancia de clase sin mucho éxito.WPF: Enlazando una etiqueta a una propiedad de clase

XAML:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W1}" VerticalAlignment="Top" /> 

    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" 
      Content="{Binding Source=MyFoo, Path=W2}" VerticalAlignment="Top" /> 

    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" 
      Name="button1" VerticalAlignment="Bottom" Width="89" 
      Click="button1_Click"> 
     Set Properties 
    </Button> 

</Grid> 
</Window> 

C#:

namespace WPFBindingTest 
{ 
    public partial class Window1 : Window 
    { 
     public Foo MyFoo; 

     public Window1() 
     { 
      InitializeComponent();    

      MyFoo = new Foo();   
     } 

     private void button1_Click(object sender, RoutedEventArgs e) 
     {  
      MyFoo.W1 = "Hello"; 
      MyFoo.W2 = "Dave"; 
     } 
    } 

    public class Foo 
    { 
     public string W1 { get; set; } 
     public string W2 { get; set; } 
    } 
} 

es decir, al hacer clic en el botón, me puse las propiedades de myFoo a "Hola" y "Dave", y quiero que refleja en el etiquetas en la interfaz de usuario. Establecí el contenido como un enlace, pero algo no está bien. ¿Qué estoy haciendo mal aquí?

Respuesta

18

Usted puede hacer que su MyFoo una propiedad de dependencia y establecer el DataContext a su Window1 ejemplo:

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ...> 

ver este article para más detalles.

Hacer MyFoo una propiedad de dependencia no es obligatoria. puede funcionar solo con una propiedad si establece el valor de propiedad antes de asignando el DataContext. (Pero nunca con un campo.) Sin embargo, si desea que las etiquetas recojan los valores cambiantes de W1 y W2 (o no sabe/importa si los valores se establecen antes o después de asignar el DataContect), necesita Foo para ser DependencyObject o implementar la interfaz INotifyPropertyChanged.

+1

Gracias, esto me señaló en la dirección correcta. Made Foo implementa INotifyPropertyChanged, luego establece DataContext of Window1 como BindingList , que contiene MyFoo. El contenido de la etiqueta ahora es: {Ruta de enlace = W1, UpdateSourceTrigger = PropertyChanged} ¡Y funciona como un regalo! – Gareth

+1

@Vlad ¿Cuál sería la diferencia entre usar 'DependencyProperty' e implementar' INotifyPropertyChanged' o debería ser una cuestión de sí mismo? – ywm

+0

@ymw: esta es una pregunta diferente, de hecho bastante grande. En resumen: ambos funcionarán solo para vincular, pero 'INotifyPropertyChanged' es más liviano,' DependencyProperty'; sin embargo, no requiere memoria si no se usa y puede usarse para animaciones, estilos, plantillas, ser heredado (del contenedor primario al contenido elemento) y mucho más. Ver por ejemplo [esta respuesta] (http://stackoverflow.com/a/3674530/276994). – Vlad

6

O darle a su ventana un nombre: como NameOfWindow y utilizar un ElementName vinculante:

Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" 

completa XAML muestra:

<Window x:Class="WPFBindingTest.Window1" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="Window1" Height="300" Width="300" Name="NameOfWindow">  
<Grid>   
    <Label Height="28" Margin="12,55,106,0" Name="label1" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W1}" VerticalAlignment="Top" /> 
    <Label Height="28" Margin="12,12,106,0" Name="label2" Background="Bisque" Content="{Binding ElementName=NameOfWindow, Path=MyFoo.W2}" VerticalAlignment="Top" /> 
    <Button Height="23" HorizontalAlignment="Right" Margin="0,0,32,48" Name="button1" VerticalAlignment="Bottom" Width="89" Click="button1_Click">Set Properties</Button> 
</Grid> 
+1

esto no está funcionando. – AnjumSKhan

Cuestiones relacionadas