WPF DataGrid не обновляется после вставки элемента в источник - PullRequest
2 голосов
/ 17 сентября 2011

Я новичок в WPF. Я пытаюсь сделать DataGrid, который связан с моей таблицей модели структуры сущностей. Имя моего стола: слова. Я пытаюсь сделать простой словарь. Я использую SQL Sever Compact, WPF, Entity Framework.

Однако после удаления записей из таблицы все работает нормально ... строки из документов DataGrid

Можете ли вы сказать мне, почему после добавления записей в сущность они не вставляются в DataGrid? После выключения программы и повторного включения записи находятся в DataGrid.

Вот мой код окна DataGrid:

<Grid>

<Grid>
        <DataGrid IsReadOnly="True" AutoGenerateColumns="False" Name="dataGrid" DataContext="{Binding }" ItemsSource="{Binding}" Margin="0,90,0,0">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Sentence" Binding="{Binding Path=sentence}" />
                <DataGridTextColumn Header="Translation" Binding="{Binding Path=translation}" />
                <DataGridTemplateColumn Header="Operations">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button Content="Delete" Click="Button_Click" Tag="{Binding Path=id}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <TextBox Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="sentence" VerticalAlignment="Top" Width="153" />
        <TextBox Height="23" Margin="171,12,131,0" Name="translations" VerticalAlignment="Top" AcceptsReturn="True" />
        <Button Content="Add" Height="23" HorizontalAlignment="Left" Margin="90,41,0,0" Name="addBtn" VerticalAlignment="Top" Width="75" Click="addBtn_Click" />
    </Grid>

Вот мой код c #:

public partial class AddWordWnd : Window {
    static dbEntities db = new dbEntities();

    public AddWordWnd() {
        InitializeComponent();
        dataGrid.DataContext = db.Words;
        dataGrid.Visibility = System.Windows.Visibility.Visible;
    }

    private void Button_Click( object sender, RoutedEventArgs e ) {
        Button btn = sender as Button;
        System.Guid ii = System.Guid.Parse(btn.Tag.ToString());
        MessageBox.Show(ii.ToString());
        db.DeleteObject(db.Words.Single(w => w.id == ii));
        db.SaveChanges();
    }

    private void addBtn_Click( object sender, RoutedEventArgs e ) {
        System.Guid gg = System.Guid.NewGuid();
        db.Words.AddObject(new Words() { id = gg, sentence = translations.Text, translation = sentence.Text });
        db.SaveChanges();
        dataGrid.Items.Refresh();
    }
}

Структура моей таблицы базы данных:

Words
---------------
id uniqueidentifier rowguidcol not null primary key,
sentence nvarchar(255) not null,
translation nvarchar(255) not null,

1 Ответ

2 голосов
/ 17 сентября 2011

Моим лучшим предположением будет то, что DataContext будет настроен на копию вашего элемента, а не на указатель на существующий элемент.

Вместо установка DataContext для элемента, привязка к этому элементу. Это заставит DataContext указывать на элемент, а не копировать его.

Binding b = new Binding();
b.Source = db.Words;
dataGrid.SetBinding(DataGrid.ItemsSourceProperty, b);

Редактировать

Только что заметил, что вы привязываетесь непосредственно к контексту. По умолчанию это не вызывает событие CollectionChanged, чтобы сообщить вашей DataGrid, что элементы изменились, поэтому DataGrid не пытается перечитать свой ItemsSource.

Попробуйте либо обновить привязку вручную (dataGrid.GetBindingExpression(DataGrid.ItemsSourceProperty).UpdateTarget()), либо обновить контекст, запросив базу данных (см. этот ответ для примера)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...