2011-09-17 80 views
1

我是新来的WPF。我尝试做一个DataGrid,它绑定在我的实体框架模型表中。我的桌子的名字是:单词。我试图做简单的字典。 我使用SQL Sever Compact,WPF,Entity框架。WPF DataGrid不会更新后源元素

然而,好的工作去除表中的记录后...从数据网格行desapers

你能告诉我为什么添加记录他们没有inseted到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, 

回答

2

我最好的猜测是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()),或通过重新查询数据库刷新上下文(见this answer为例)

+0

感谢您的答复,但它仍然didnt解决我的问题...:/ – nosbor

+0

只是注意到你直接绑定到上下文。默认情况下,这并不会引发CollectionChanged事件来告诉您的DataGrid项目已更改,因此DataGrid不会尝试重新读取它的ItemsSource。尝试在绑定上手动引发PropertyChanged事件 – Rachel

+0

如果您告诉我该如何做到这一点,那将非常有用。即时通讯新的WPF。这是我在WPF写东西的第二天。 – nosbor