2009-03-20 42 views
43

¿Cómo puedo acceder a la variable pública que en el archivo Sample.xaml.cs como asp.net <% = VariableName%>?Variable de código de acceso en XAML

+0

[Esta pregunta también puede ser útil] (http://stackoverflow.com/questions/1481130/wpf-binding-to-local-variable) ya que es un poco más reciente ... – Brendan

Respuesta

60

Hay algunas formas de hacerlo.

  • Añadir la variable como un recurso de código subyacente:

    myWindow.Resources.Add("myResourceKey", myVariable); 
    

    A continuación, se puede acceder a él desde XAML:

    <TextBlock Text="{StaticResource myResourceKey}"/> 
    

    Si tiene que añadirlo después de la XAML se analiza, puede usar un DynamicResource arriba en lugar de StaticResource.

  • Haga que la variable sea una propiedad de algo en su XAML. Por lo general, esto funciona a través de la DataContext:

    myWindow.DataContext = myVariable; 
    

    o

    myWindow.MyProperty = myVariable; 
    

    Después de esto, cualquier cosa en su XAML puede acceder a él a través de un Binding:

    <TextBlock Text="{Binding Path=PropertyOfMyVariable}"/> 
    

    o

    <TextBlock Text="{Binding ElementName=myWindow, Path=MyProperty}"/> 
    
9

Para ventanas rápidas y sucias en WPF, prefiero vincular el DataContext de la Ventana a la ventana misma; esto se puede hacer todo en XAML.

Window1.xaml

<Window x:Class="WpfApplication1.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    DataContext="{Binding RelativeSource={RelativeSource self}}" 
    Title="Window1" Height="300" Width="300"> 
    <StackPanel> 
     <TextBlock Text="{Binding Path=MyProperty1}" /> 
     <TextBlock Text="{Binding Path=MyProperty2}" /> 
     <Button Content="Set Property Values" Click="Button_Click" /> 
    </StackPanel> 
</Window> 

Window1.xaml.cs

public partial class Window1 : Window 
{ 
    public static readonly DependencyProperty MyProperty2Property = 
     DependencyProperty.Register("MyProperty2", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty)); 

    public static readonly DependencyProperty MyProperty1Property = 
     DependencyProperty.Register("MyProperty1", typeof(string), typeof(Window1), new UIPropertyMetadata(string.Empty)); 

    public Window1() 
    { 
     InitializeComponent(); 
    } 

    public string MyProperty1 
    { 
     get { return (string)GetValue(MyProperty1Property); } 
     set { SetValue(MyProperty1Property, value); } 
    } 

    public string MyProperty2 
    { 
     get { return (string)GetValue(MyProperty2Property); } 
     set { SetValue(MyProperty2Property, value); } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     // Set MyProperty1 and 2 
     this.MyProperty1 = "Hello"; 
     this.MyProperty2 = "World"; 
    } 
} 

En el ejemplo anterior, tenga en cuenta la unión utilizado en la propiedad DataContext en la ventana, este dice " Establezca su contexto de datos para usted ". Los dos bloques de texto están vinculados a MyProperty1 y MyProperty2, el controlador de eventos para el botón establecerá estos valores, que se propagarán automáticamente a la propiedad Text de los dos TextBlocks ya que las propiedades son Propiedades de dependencia.

23

para la unión, si DataContext no está en uso, sólo tiene que añadir esto a la constructora del código detrás:

this.DataContext = this; 

uso de este, cada propiedad en el código se hace accesible a la unión:

<TextBlock Text="{Binding PropertyName}"/> 

Otra forma es simplemente dar un nombre al elemento raíz del XAML:

x:Name="root" 

Desde el XAML se compila como una clase parcial del código subyacente, podemos tener acceso a todos los bienes por nombre:

<TextBlock Text="{Binding ElementName="root" Path=PropertyName}"/> 

Nota: el acceso sólo está disponible para las propiedades; no a los campos. y get; o {Binding Mode = OneWay} son necesarios. Si se utiliza el enlace OneWay, los datos subyacentes deben implementar INotifyPropertyChanged.

+1

¡Gracias! Esta respuesta me ayudó. No pude usar el método DataContext porque estoy creando un control de usuario, y si configuro el contexto de datos bajo mi control, entonces mi control no podrá obtener el contexto de datos de sus padres cuando lo use en las aplicaciones. La vinculación directa a la raíz me dio el mismo resultado que estaba buscando y deja intacto el contexto de datos de mi control. –

+1

El "{Binding PropertyName}" funciona solo en propiedad pública. – Duc

+0

Gracias por el consejo "raíz". Funciona a pesar de que las propiedades del código subyacente no aparecen en el diseñador de enlaces visuales, lo cual es un poco confuso. –

3

También vale la pena señalar que un 'Enlace' solo se puede establecer en una DependencyProperty de un DependencyObject. Si desea establecer una Propiedad no Dependency (por ejemplo, una propiedad normal) en un objeto en XAML, tendrá que utilizar el primer método de Robert de usar recursos en el código subyacente.

Cuestiones relacionadas