2010-12-03 23 views
7

Me preguntaba cómo podría vincular un bloque de texto a una variable dentro de mi clase C#.Cómo enlazar una variable con un bloque de texto

Básicamente tengo una variable "carro" en mi archivo .cs. Dentro de esa clase de Carro tengo acceso a los diferentes totales.

Lo siguiente es lo que tengo para la unión, pero no parece que se unen a la variable ...

<StackPanel 
    Width="Auto" 
    Height="Auto" 
    Grid.ColumnSpan="2" 
    Grid.Row="5" 
    HorizontalAlignment="Right"> 
    <TextBlock 
     Name="Subtotal" 
     FontFamily="Resources/#Charlemagne Std" 
     FontSize="20" 
     Text="{Binding ElementName=cart, Path=SubTotal}"> 
    </TextBlock> 
    <TextBlock 
     Name="Tax" 
     FontFamily="Resources/#Charlemagne Std" 
     FontSize="20" 
     Text="{Binding ElementName=cart, Path=Tax}"> 
    </TextBlock> 
    <TextBlock 
     Name="Total" 
     FontFamily="Resources/#Charlemagne Std" 
     FontSize="20" 
     Text="{Binding ElementName=cart, Path=Total}"> 
    </TextBlock> 
</StackPanel> 

Cuál es la forma correcta de hacerlo? ¡Gracias de nuevo por la ayuda!

Respuesta

11

Si Además, desea que los TextBoxes se actualicen automáticamente cuando su clase de carrito de compra cambie, su clase debe implementar EMENT la interfaz INotifyPropertyChanged:

class Cart : INotifyPropertyChanged 
{ 
    // property changed event 
    public event PropertyChangedEventHandler PropertyChanged; 

    private int _subTotal; 
    private int _total; 
    private int _tax; 

    private void OnPropertyChanged(String property) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(property)); 
     } 
    } 

    public int SubTotal 
    { 
     get 
     { 
      return _subTotal; 
     } 
     set 
     { 
      _subTotal = value; 
      OnPropertyChanged("SubTotal"); 
     } 
    } 

    public int Total 
    { 
     get 
     { 
      return _total; 
     } 
     set 
     { 
      _total = value; 
      OnPropertyChanged("Total"); 
     } 
    } 

    public int Tax 
    { 
     get 
     { 
      return _tax; 
     } 
     set 
     { 
      _tax = value; 
      OnPropertyChanged("Tax"); 
     } 
    } 

} 
0

Debe configurar su clase como fuente de datos para su formulario. Vea también this question.

7

ElementName en encuadernación se utiliza para hacer referencia a otros controles, no a las variables del código subyacente. Para hacer referencia a las variables en el código subyacente, debe asignar esa variable a la propiedad Control de DataContext.

reemplazar todas las apariciones de línea de código siguiente:

<TextBlock Name="Subtotal" FontFamily="Resources/#Charlemagne Std" FontSize="20" Text="{Binding ElementName=cart, Path=SubTotal}"></TextBlock> 

con:

<TextBlock Name="Subtotal" FontFamily="Resources/#Charlemagne Std" FontSize="20" Text="{Binding Path=SubTotal}"></TextBlock> 

Y en caso constructor o de carga de su ventana, escribir código siguiente:

this.DataContext = cart; 
+0

Id recomiendo configurar el datacontext en el ancestro común más cercano en lugar de toda la ventana ... ¿qué ocurre con los enlaces en otros controles? – Machinarius

2

Dos soluciones ..

Primera solución:

Ponga la cart como origen de datos en su código detrás:

DataSource = cart; 

y se unen a ella de la siguiente manera:

{Binding Path=PropertyOfCart} 

Segunda solución:

atan a su control de la raíz con un ElementName vinculante, y obtener el carro a través de una propiedad en este control:

Nombre su raíz/control de los padres, donde la compra es un hotel fenomenal:

<UserControl .....snip..... x:Name="Root"> 

unirá a él de esta manera:

{Binding ElementName=Root, Path=Cart.PropertyOfCart} 

Tenga en cuenta que el carrito debe ser propiedad de su UserControl y no del campo

Cuestiones relacionadas