2010-12-03 24 views
7

Je me demandais comment je serais capable de lier un bloc de texte à une variable dans ma classe C#.Comment lier une variable avec un bloc de texte

Fondamentalement, j'ai une variable "cart" dans mon fichier .cs. Dans cette classe Cart j'ai accès aux différents totaux.

Ce qui suit est ce que j'ai pour la liaison, mais elle ne semble pas lier 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> 

Quelle est la bonne façon de le faire? Merci encore pour votre aide!

Répondre

11

Si vous souhaitez en outre que les TextBox soient automatiquement mis à jour lorsque votre classe de panier change, votre classe doit implémenter EMENT l'interface 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

Vous devez définir votre classe en tant que source de données pour votre formulaire. Voir aussi this question.

7

ElementName dans la liaison est utilisé pour faire référence à d'autres contrôles, pas de variables dans le code derrière. Pour référencer des variables dans le code derrière, vous devez affecter cette variable à la propriété DataContext d'un contrôle.

Remplacer toutes les occurrences de ligne de code suivante:

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

avec:

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

Et dans votre constructeur de fenêtre ou événement de charge, écrire le code suivant:

this.DataContext = cart; 
+0

Il est recommandé de définir le paramètre de données sur l'ancêtre commun le plus proche au lieu de la fenêtre entière .... qu'en est-il des liaisons dans d'autres contrôles? – Machinarius

2

Deux .. des solutions

solution Première:

Mettez le cart comme DataSource dans votre code derrière:

DataSource = cart; 

Et se lier à elle comme suit:

{Binding Path=PropertyOfCart} 

Deuxième solution:

Bind à votre contrôle racine avec un ElementName liant, et obtenir le panier par une propriété sur ce contrôle:

Nom de votre contrôle racine/mère où panier est un propery:

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

Bind à elle comme ceci:

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

Veuillez noter que le chariot doit être une propriété de votre UserControl, et non un champ