2010-11-23 3 views
0

Вы можете прочитать полную структуру моего решения here, но вот краткий справочник:WPF Связывание данных: как привязать данные к коллекции?

  1. Я сделал класс Account.cs в библиотеке Entities класса.
  2. Я создал библиотеку классов Core с классом AccountController.cs, который получает учетные записи из таблиц сервера Sql.
  3. Я сделал класс AccountWindowController.cs в библиотеке классов Gui.Wpf.Controllers. Он содержит имущество List<Account> Accounts и требует, чтобы GetAccounts() в AccountController, чтобы заполнить этот список.
  4. Наконец, я сделал AccountWindow.xaml в библиотеке классов Gui.Wpf. Это окно WPF содержит ListBox, названное AccountsListBox.

Я хочу привязать данные к списку из AccountWindow к списку в AccountWindowController, но я не знаю как. Вот соответствующий код:

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); 
    } 
} 

Благодарим за помощь.

ответ

1

The ItemsSource потребности быть IEnumerable. Ресурс AccountsCollection - это класс, который содержит свойство, которое вы хотите использовать. Для того, чтобы сделать это, вам нужно привязать к этой собственности, и использовать этот ресурс в качестве источника связывания:

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

Вы должны также осуществлять INotifyPropertyChanged на AccountWindowController (и поднять PropertyChanged в инкубаторе счетов) так что, если вы установите свойство Accounts, то ListBox переустанавливается в новую коллекцию. И если коллекция учетных записей изменена во время выполнения, она должна быть ObservableCollection.

0

Похоже, вы рядом с ним. Попробуйте изменить

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

В

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

Спасибо за ответ Мэтью. Изменение кода привело к ошибке компиляции с сообщением об ошибке: Ошибка Неизвестное свойство «Путь» для типа «System.Windows.StaticResourceExtension», встречающееся при разборе Расширения разметки. Должен ли я изменить что-то еще? – Boris 2010-11-23 19:04:10

+0

Извинения, я пропустил немного. Пожалуйста, попробуйте еще раз. – 2010-11-23 20:34:44

Смежные вопросы