2010-11-23 17 views
0

Vous pouvez lire la structure complète de ma solution here, mais voici la référence rapide:WPF Liaison de données: comment lier des données à une collection?

  1. J'ai fait une classe Account.cs dans la bibliothèque de classes Entities.
  2. J'ai créé une bibliothèque de classes Core avec une classe AccountController.cs qui obtient les comptes à partir des tables Sql Server. J'ai créé une classe AccountWindowController.cs dans la bibliothèque de classes Gui.Wpf.Controllers. Il contient la propriété List<Account> Accounts et appelle la méthode GetAccounts() dans le AccountController pour remplir cette liste.
  3. Enfin, j'ai créé un AccountWindow.xaml dans la bibliothèque de classes Gui.Wpf. Cette fenêtre WPF contient un ListBox nommé AccountsListBox.

Je veux que les données lient la zone de liste de AccountWindow à la liste dans le AccountWindowController, mais je ne sais pas comment. Voici le code correspondant:

AccountWindow.xaml

<Window x:Class="Gui.Wpf.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:controller="clr-namespace:Gui.Wpf.Controllers" 
    Title="Accounts" 
    Width="350" 
    MinWidth="307" 
    MaxWidth="400" 
    Height="500" > 

    <Window.Resources> 
     <controller:AccountWindowController 
      x:Key="AccountsCollection" /> 
    </Window.Resources> 

    <Grid> 
     <ListBox 
      Name="AccountsListBox" 
      Margin="12,38,12,41" 
      ItemsSource="{StaticResource ResourceKey=AccountsCollection}" /> 
    </Grid> 

</Window> 

AccountWindow.xaml.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     new Gui.Wpf.Controllers.AccountWindowController(); 
    } 
} 

AccountWindowController.cs

public class AccountWindowController 
{ 
    //This event is handled in the AccountController.cs 
    //that sets the Accounts property defined below. 
    public event EventHandler GetAccounts; 

    private List<Account> accounts; 
    public List<Account> Accounts 
    { 
     get 
     { 
      GetAccounts(this, new EventArgs()); 
      return accounts; 
     } 
     set 
     { 
      this.accounts = value; 
     } 
    } 

    //Constructor 
    public AccountWindowController() 
    { 
     new AccountController(this); 
    } 
} 

Merci pour toute l'aide.

Répondre

1

Les ItemsSource doit être un IEnumerable. La ressource AccountsCollection est une classe qui contient la propriété que vous souhaitez utiliser. Pour ce faire, vous devez lier à cette propriété, et utiliser la ressource comme source de la liaison:

<ListBox Name="AccountsListBox" 
     Margin="12,38,12,41" 
     ItemsSource="{Binding Accounts, Source={StaticResource ResourceKey=AccountsCollection}}" /> 

Vous devez également mettre en œuvre INotifyPropertyChanged sur le AccountWindowController (et augmenter PropertyChanged dans le setter des comptes) de sorte que si vous définissez la propriété Accounts, le ListBox se reconnectera à la nouvelle collection. Et si la collection Comptes est modifiée au moment de l'exécution, elle doit être ObservableCollection.

+0

Abe, merci beaucoup! Tout est clair pour moi maintenant et cela fonctionne; très appréciée. – Boris

0

On dirait que vous êtes presque là avec. Essayez de changer

ItemsSource="{StaticResource ResourceKey=AccountsCollection}" /> 

Dans

ItemsSource="{Binding Source={StaticResource ResourceKey=AccountsCollection}, Path=Accounts}" /> 
+0

Merci pour la réponse Matthew. La modification du code a entraîné l'erreur de compilation avec le message d'erreur: Erreur Propriété Unknown 'Path' pour le type 'System.Windows.StaticResourceExtension' rencontré lors de l'analyse d'une extension de marquage. Devrais-je changer autre chose aussi? – Boris

+0

Excuses, j'avais raté un peu. Veuillez réessayer. –