3

私はWPFが初めてです。現在、Entity Framework で WPF のプロジェクトを作成しています。wpf でアイテムを正しく追加および削除できます。ただし、アイテムを追加または削除した後でも、データグリッドは更新されませんでした。私でさえ、ssEntities.SaveChanges(); ssEntities.Refresh(RefreshMode.StoreWins, ssEntities.User);

リフレッシュ機能または別の機能を使用してデータグリッドを自動的にリフレッシュするにはどうすればよいですか?

XAML

<Window.Resources>
    <CollectionViewSource x:Key="UserViewSource" 
                          d:DesignSource="{d:DesignInstance my:User, CreateList=True}" />
</Window.Resources>
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="537"  
          HorizontalAlignment="Left" ItemsSource="{Binding}" Margin="12,12,0,0" 
          Name="UserDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" 
          VerticalAlignment="Top" Width="300" 
          SelectedCellsChanged="UserDataGrid_SelectedCellsChanged">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="IDColumn" Binding="{Binding Path=ID}" Header="ID"
                            Width="80" IsReadOnly="True" />
        <DataGridTextColumn x:Name="NameColumn" Binding="{Binding Path=Name}" 
                            Header="Name" Width="80" IsReadOnly="True" />
    </DataGrid.Columns>
</DataGrid>

cs

 private void btnSave_Click(object sender, RoutedEventArgs e)
 {
     try
     {
         if (ActionHandler == "Add")
         {
             User user = new User();   
             user.ID = ID;
             user.Name = Name;

             ssEntities.User.AddObject(user);
         }

         ssEntities.SaveChanges();
         ssEntities.Refresh(RefreshMode.StoreWins, ssEntities.User);
     }
     catch (Exception ex)
     { MessageBox.Show(ex.Message); }
 }
4

2 に答える 2

0

他の回答でコメントした他の人に同意します。このようなものにはMVVMを採用する必要があります。

そうは言っても、あなたの DataContext はStudyEntities ssEntities;. それはあなたのObjectContextですか?1本として使われているようです。大規模なデータ セットに対してカスタム フィルタリングや並べ替えを行う必要がない限り、通常は CollectionViewSource を使用しません。それ以外の場合は、ObservableCollection を使用します。

次のようなもので十分です。

private ObservableCollection<User> MyUsers { get; set; }
private StudyEntities ssEntities;

public MyMainWindow()
{
    ssEntities = new StudyEntities();
    MyUsers = new ObservableCollection<User>(ssEntities.Users.ToList());
}

private void btnSave_Click(object sender, RoutedEventArgs e)
{
    //Code for creating the User isntance MyUser
    MyUsers.Add(MyUser);
    ssEntities.Users.Add(MyUser);
    ssEntities.SaveChanges();
}

エンティティは、UI で操作できるように ObservableCollection に配置されます。ボタンをクリックすると、ユーザーが作成され、それが ObservableCollection と ObjectContext に追加され、変更が保存されます。レコードに対して生成された ID は、変更の保存時に入力されます。

于 2013-05-23T14:00:23.210 に答える
-1

一般的な List を使用していると仮定すると、バインディングで UpdateSourceTrigger を変更し、特定の要素をバインドする必要があります (listUser の例)。

DataGrid で、次のように変更します。

ItemsSource="{Binding}" 

に:

ItemsSource="{Binding listUser, UpdateSourceTrigger=PropertyChanged}" 

次に、コード ビハインドで INotifyPropertyChanged を実装し、実行します。

OnPropertyChanged("listUser");

プロパティのソースが変更されました: http://msdn.microsoft.com/en-us/library/ms743695.aspx

于 2013-03-11T04:20:29.303 に答える