如何刷新WPF DataGrid

时间:2015-03-18 09:21:55

标签: c# wpf binding datagrid

我有DataGrid绑定ItemsSource

<DataGrid
    x:Name="grid"
    FlowDirection="RightToLeft"
    AutoGenerateColumns="False"
    ItemsSource="{Binding ListGuards}"
    IsReadOnly="True">

列定义(一个例子):

<DataGridTextColumn Header="ID" Binding="{Binding Id}" />

代码隐藏:

public ObservableCollection<TableGuard> ListGuards { get; set; }
public C'tor(...) {
    ListGuards = new ObservableCollection<TableGuard>(s); //s = List<TableGuard>
    this.DataContext = this;
}

提交数据:

private void submit(object sender, RoutedEventArgs e) {
        if (list == null)
            list = new List<TableGuard>();

        TableGuard guard = new TableGuard();
        guard.FName = fName.Text;
        guard.LName = lName.Text;
        guard.Id = int.Parse(id.Text);
        guard.WorkPlace = workPlace.Text;
        guard.LastTraining = lastTraining.Text;
        guard.NextTraining = nextTraining.Text;
        guard.Birthday = birthDay.Text;
        guard.TrainingType = trainingType.Text;

        bool exists = false;
        foreach (var g in list)
            if (guard.Id == g.Id) {
                exists = true;
                break;
            }

        if (exists)
            MessageBox.Show("ID EXISTS!");
        else if (id.Text.Length < 9)
            MessageBox.Show("ID NEEDS TO BE 9 DIGITS!");
        else {
            if (isEdit) {
                jsonObj[selectedRow]["Id"] = guard.Id;
                jsonObj[selectedRow]["FName"] = guard.FName;
                jsonObj[selectedRow]["LName"] = guard.LName;
                jsonObj[selectedRow]["Birthday"] = guard.Birthday;
                jsonObj[selectedRow]["LastTraining"] = guard.LastTraining;
                jsonObj[selectedRow]["NextTraining"] = guard.NextTraining;
                jsonObj[selectedRow]["WorkPlace"] = guard.WorkPlace;
                jsonObj[selectedRow]["TrainingType"] = guard.TrainingType;
                File.WriteAllText(path, JsonConvert.SerializeObject(jsonObj));
                Close();
            } else {
                list.Add(guard);
                File.WriteAllText(path, JsonConvert.SerializeObject(list));
                Close();
            }
        }
    }

我想在编辑一些数据后刷新DataGrid。我该怎么做?

4 个答案:

答案 0 :(得分:0)

试试这个:

grid.Items.Refresh();

我想知道这是否适合你的情况。

编辑:拼写

答案 1 :(得分:-2)

当您使用ObservableCollection时,您的网格会在列表中添加删除时更新。

但是,如果您要实例化新的ObservableCollection,则您的网格不会更新,因为您的媒体资源未实施INotifyPropertyChanged

在您的班级中实施INotifyPropertyChanged界面并调用PropertyChanged事件来更新您的网格:

private ObservableCollection<TableGuard> _ListGuards;

    public ObservableCollection<TableGuard> ListGuards
    {
        get { return _ListGuards; }
        set 
        { 
            _ListGuards = value;
            OnPropertyChanged("ListGuards");
        }
    }

编辑:

提交方法结束时,您只需重置 ListGuards 列表中的所有项目。在项目上实施.Clear()后,可以调用ObservableCollection方法并将项目添加到集合中,或者实例化新的INotifyPropertyChanged

答案 2 :(得分:-2)

您的TableGuard类必须实现INotifyPropertyChanged并正确引发它。在datagrid的您的columnsdefinition中,您必须将模式设置为TwoWay。如果您在集合中添加和删除项目,请查看其他答案。

仅适用于downvote:

如果您调试代码并在ctor中的行中

this.DataContext = this;

您的Property ListGuards属性为空,您从不使用ListGuards.Add / Remove,您不应该在网格中看到任何内容。

答案 3 :(得分:-2)

的Android

在您提交的方法中,您可以将ListGuard设置为列表,或者只是添加ListGuard集合中的所有对象