WPF Привязка данных: как привязать данные к коллекции? - PullRequest
0 голосов
/ 23 ноября 2010

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

  1. Я создал класс Account.cs в библиотеке классов Entities.
  2. Я создал библиотеку классов Core с классом AccountController.cs, который получает учетные записи из таблиц Sql Server.
  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);
    }
}

Спасибо за помощь.

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

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

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

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

0 голосов
/ 23 ноября 2010

Похоже, вы почти у цели.Попробуйте изменить

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

На

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