2016-07-15 1 views
-4

J'ai un TextBlock dans un ComboBox dans un projet C# WPF lié à une liste d'éléments 'Enveloppe', qui ont une chaîne 'Nom' et une double propriété 'Poids' , dont je voudrais voir le premier dans le TextBlock.chaîne liée à TextBlock dans ComboBox ne s'affiche pas

Lorsque j'exécute mon programme, le ComboBox apparaît sans aucun texte. Il a correctement trois éléments non étiquetés, et si je vois le ItemsSource ou SelectedItem du ComboBox ils montrent les valeurs appropriées, et tout autre code qui interagit avec le SelectedItem du ComboBox se comporte correctement. La seule chose qui ne fonctionne pas est que le TextBlock ne contient aucun texte. Si je remplace le "{Binding Name}" par "au ghdfjlnvgmumar" alors les caractères brouillés appropriés apparaissent dans le ComboBox, donc c'est définitivement un problème avec la liaison. Quel est le problème et comment puis-je le contourner?

Code pertinent:

XAML:

<ComboBox Name="EnvelopeList" HorizontalAlignment="Center" Width="200" > 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel> 
       <TextBlock Text="{Binding Name}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

C#:

//main window code 
public MainWindow() 
{ 
    InitializeComponent(); 

    envelopes = new List<Envelope>(); 
    envelopes.Add(new Envelope("TEST", 0)); 
    envelopes.Add(new Envelope("HI", 10)); 

    EnvelopeList.ItemsSource = envelopes; 
} 

//Envelope class 
class Envelope 
{ 
    public string Name; 
    public double Weight; 

    public Envelope() 
    { 
     Name = "[None]"; 
     Weight = 0; 
    } 
    public Envelope(string n, double w) 
    { 
     Name = n; 
     Weight = w; 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

Répondre

-1

Name est un champ , vous ne pouvez lier à properties.

+0

Merci. Acceptera une fois que je peux. –

2

Lorsque DataBinding, vous pouvez uniquement lier aux propriétés. En outre, vous devez mettre à jour vos propriétés avec un PropertyChangedEvent. Sinon, si vous modifiez votre propriété après la liaison initiale, l'interface utilisateur ne sera pas mise à jour.

Vous devez utiliser sur la propriété changé et une propriété

public class Envelope: ModelBase 
    { 
     private string _name; 

     public string Name 
     { 
      get { return _name; } 
      set { _name= value; OnPropertyChanged("Name"); } 
     } 

    } 

    public class ModelBase : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public void OnPropertyChanged(string propName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 

      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propName)); 
      } 
     } 
    } 

Enfin, je remarque que vous configurez ItemsSource directement. Au lieu de cela, vous souhaitez définir la propriété DataContext de votre vue, puis lier à votre ItemsSource

Voici un MSDN article on DataBinding qui vous apprendra comment le faire correctement.