2010-01-03 6 views
0

En application WPF J'ai ListView:WPF ListView à databinding ObservableCollection

<ListView Height="100" Width="434" x:Name="lvItems" ItemsSource="{Binding ElementName=MainWindow, Path=ShowQuCollection}" > 
<ListView.View> 
    <GridView> 
    <GridViewColumn Header="Date" Width="100" DisplayMemberBinding="{Binding Date}"/> 
    <GridViewColumn Header="Time" Width="100" DisplayMemberBinding="{Binding Time}"/> 
    <GridViewColumn Header="Description" Width="200" DisplayMemberBinding="{Binding Description}"/> 
    </GridView> 
</ListView.View> 

qui est relié à ObservableCollection par liaison de données:

ObservableCollection<ShowsQu> _ShowQuCollection = 
    new ObservableCollection<ShowsQu>(); 

public ObservableCollection<ShowsQu> ShowQuCollection 
{ get { return _ShowQuCollection; } } 

public class ShowsQu 
{ 
public string ShowCode { get; set; } 
public DateTime Date { get; set; } 
public TimeSpan Time { get; set; } 
public string Description { get; set; } 
} 

Ce ObservableCollection est placé dans le code- derrière le fichier de la même fenêtre, où ListView est MainWindow. Tout fonctionne bien.

Maintenant j'ajoute encore un autre ListView à une fenêtre différente et dans ce cas, la liaison de données ne fonctionne pas. Cette pièce de liaison de données de XAML je ne change pas:

ItemsSource="{Binding ElementName=MainWindow, Path=ShowQuCollection} 

Comment dois-je modifier cette déclaration ListView databinding (ListView en SecondWindow) afin qu'il a été relié à la ObservableCollection dans le MainWindow?

Répondre

4

Les liaisons ElementName ne s'affichent que dans la fenêtre en cours. Vous devez définir explicitement la source de liaison ou (plus probablement) DataContext local dans cette autre fenêtre.

Toutefois, une meilleure approche consiste à supprimer ShowQuCollection de la classe Window et à l'intégrer à une classe "view model" distincte (données non visuelles uniquement). Vous pouvez ensuite faire en sorte que les deux Windows aient le même DataContext (une instance de la classe de modèle de vue) et que vous n'ayez pas du tout besoin d'utiliser une liaison ElementName. Les liaisons ElementName sont généralement utilisées lorsque quelque chose dépend d'un autre contrôle de l'interface utilisateur (par exemple, lier la visibilité d'un Panel à IsChecked d'une CheckBox), plutôt que de faire référence à des données réelles.

0

Si par 'fenêtre différente' vous voulez dire une classe différente, alors vous devez définir le DataContext de la seconde fenêtre comme étant le même que le datacontext du premier.