更新datagrid WPF

时间:2014-06-27 12:56:50

标签: c# wpf

我创建了这个窗口: enter image description here

当我添加新用户,删除或更新时,它成功应用于服务器。但它不会更新下面的数据网格。这是我的一个职能:

private void Delete_Button_Click(object sender, RoutedEventArgs e)
{
    using(var ctx = new PersonelContext())
    {
        PersonelEntity personel = (
            from s in ctx.Personels
                where s.Name == NameBox.Text
                select s).FirstOrDefault();
        ctx.Personels.Remove(personel);
        ctx.SaveChanges();
    }                        

    this.personelEntityDataGrid.Items.Refresh();

}

如您所见,我正在刷新数据网格,但它仍然没有显示新结果。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

MVVM示例

假设您有一个带有datagrid的窗口:

<Window x:Class="WpfApplication7.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <DataGrid ItemsSource="{Binding Personels}">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Nom" Binding="{Binding Nom}" Width="200"></DataGridTextColumn> 
        </DataGrid.Columns>
    </DataGrid>
</Window>

我们必须定义他的datacontext(或绑定不知道在哪里找到):

namespace WpfApplication7
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.DataContext = new MainViewModel(this);
        }
    }
}

然后我们可以定义ViewModel(窗口的datacontext):

class MainViewModel : ViewModelBase
    {
        /// <summary>
        /// Référence de la fenêtre principale
        /// </summary>
        private MainWindow mainWindow;

        /// <summary>
        /// Liste des personels
        /// </summary>
        private ObservableCollection<Personel> personels = new ObservableCollection<Personel>();


        public ObservableCollection<Personel> Personels
        {
            get 
            {
                return personels;
            }
        }

        /// <summary>
        /// Constructeur de la classe
        /// </summary>
        /// <param name="mainWindow">Référence de la fenêtre principale</param>
        public MainViewModel(MainWindow mainWindow)
        {
            this.mainWindow = mainWindow;

            AddPersonel("Toto");

            AddPersonel("Jack");

            AddPersonel("Momo");

            AddPersonel("Momo");

            AddPersonel("Momo");

            AddPersonel("Momo");
        }

        private void AddPersonel(string namePersonel)
        {
            personels.Add(new Personel() { Name = namePersonel });
            OnPropertyChanged("Personels");
        }
    }

    class Personel
    {
        private string name = "NoName";

        public string Name
        {
            get { return name; }
            set { name = value; }
        }
    }

MainViewModel必须实现INotifyPropertyChanged以通知控件属性值已更改。 :

public abstract class ViewModelBase : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }

答案 1 :(得分:1)

您需要首先实现INotifyPropertyChanged接口。

此外,当您从列表中删除该项目时,请创建一个没有该项目的新列表,并将其设置为DataGrid的项目源

IEnumerable<Personels> res = m_Parameters.Where( p.Name != NameBox.Text));

personelEntityDataGrid.ItemsSource = res;