Как привязать EDM к WPF ListBox? - PullRequest
1 голос
/ 28 декабря 2010

Я пытаюсь выяснить привязку WPF к SQLite.

У меня есть модель данных объекта ADO.NET, созданная для представления моей базы данных SQLite.База данных содержит только одну таблицу «Люди» с двумя столбцами «person_id» и «person_name».Теперь я сгенерировал классы EDM для этой таблицы в своем приложении WPF.

Я пытаюсь привязать список к списку.Я могу удалить элементы из источника и увидеть, как он обновляет список.Но я не могу добавить элементы к источнику, используя текстовое поле, и вижу, как оно обновляет список.

Я объявил объекты данных в классе Window1 следующим образом:


private static MyNewSqliteDbEntities2 _myEntities = new MyNewSqliteDbEntities2();

У меня естьОкно списка, которое привязано к ObjectQuery в обработчике событий Window_Loaded, например:


private void Window_Loaded(object sender, RoutedEventArgs e)
{
    peopleListBox.ItemsSource = _myEntities.People;
}

У меня есть еще одно текстовое поле, которое я использую для добавления людей, нажав на кнопку.И я могу удалить элементы, выбрав элемент в списке и нажав кнопку удаления.Изменения фиксируются в базе данных при нажатии кнопки фиксации.Пожалуйста, рассмотрите код ниже:


private void addButton_Click(object sender, RoutedEventArgs e)
{
    if (addPersonTextBox.Text != "")
    {
        People newPerson = new People();
        newPerson.person_name = addPersonTextBox.Text;
        //_myEntities.AddToPeople(newPerson);
        _myEntities.AddObject("People", newPerson);

        addPersonTextBox.Text = "";
    }
}

private void deleteButton_Click(object sender, RoutedEventArgs e)
{
    _myEntities.DeleteObject(peopleListBox.SelectedItem);
}

private void commitButton_Click(object sender, RoutedEventArgs e)
{
    _myEntities.SaveChanges();
}

Я попытался обновить элемент управления списком с помощью другой кнопки под названием «Обновить» следующим образом, но безуспешно (хотя, когда я перебираю код, я вижу источникобновляется):


private void refreshButton_Click(object sender, RoutedEventArgs e)
{
    peopleListBox.ItemsSource = null;
    peopleListBox.ItemsSource = _myEntities.People;
}

Вот код XAML, если вам интересно:


&ltWindow x:Class="BindingToSqLite.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="400" Width="400" Loaded="Window_Loaded"&gt
    &ltWindow.Resources&gt
        &ltDataTemplate x:Key="personNameTemplate"&gt
            &ltTextBlock Text="{Binding Path=person_name}"/&gt
        &lt/DataTemplate&gt
    &lt/Window.Resources&gt
    &ltGrid&gt
        &ltGrid.ColumnDefinitions&gt
            &ltColumnDefinition Width="190*" /&gt
            &ltColumnDefinition Width="94*" /&gt
            &ltColumnDefinition Width="94*" /&gt
        &lt/Grid.ColumnDefinitions&gt
        &ltGrid.RowDefinitions&gt
            &ltRowDefinition Height="182*" /&gt
            &ltRowDefinition Height="38*" /&gt
            &ltRowDefinition Height="38*" /&gt
            &ltRowDefinition Height="32*" /&gt
        &lt/Grid.RowDefinitions&gt
        &ltListBox Margin="5" Name="peopleListBox" Grid.ColumnSpan="3" ItemTemplate="{StaticResource personNameTemplate}" /&gt
        &ltTextBox Grid.Row="1" Grid.ColumnSpan="2" Margin="5,10" Name="addPersonTextBox" /&gt
        &ltButton Grid.Column="2" Grid.Row="1" Margin="5" Name="addButton" Click="addButton_Click"&gtAdd&lt/Button&gt
        &ltButton Grid.Row="2" Margin="5" Name="commitButton" Click="commitButton_Click"&gtCommit&lt/Button&gt
        &ltButton Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2" Margin="5" Name="deleteButton" Click="deleteButton_Click"&gtDelete&lt/Button&gt
        &ltButton Grid.Row="3" Margin="5" Name="refreshButton" Click="refreshButton_Click"&gtRefresh&lt/Button&gt
    &lt/Grid&gt
&lt/Window&gt

Я не уверен, что делаю это совершенно неправильно.Любая помощь приветствуется.

1 Ответ

0 голосов
/ 28 декабря 2010

Свойство People должно быть ObservableCollection<T>, чтобы это работало.

...