WPF DataGrid 在代码中更新其 ItemsSource 时不更新 UI

标签 wpf mvvm datagrid

当 WPF DataGrid 在其 ObservableCollection 的项目中更改代码时,我应该怎么做?

<DataGrid HorizontalAlignment="Left" Height="100" Margin="54,25,0,0" VerticalAlignment="Top" Width="264" 
    IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" 
    ItemsSource="{Binding DataSource}" SelectedItem="{Binding SelectedPerson}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding FirstName}" />
        <DataGridTextColumn Binding="{Binding LastName}" />
    </DataGrid.Columns>
</DataGrid>

我更新 SelectedPerson.FirstName在代码和 DataSource 的 setter 中执行。当前DataSource.FirstName已更新,但 DataGrid 不显示更改。如果我单击列标题,DataGrid 会刷新并显示更改的数据。当我使用 MVVM 并且我没有对 DataGrid 的引用时,如何让它迅速刷新?
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class VM : Notifier
{
    private ObservableCollection<Person> dataSource;
    public ObservableCollection<Person> DataSource
    {
        get { return dataSource; }
        set
        {
            dataSource = value;
            OnPropertyChanged("DataSource");
        }
    }

    private Person selectedPerson;
    public Person SelectedPerson
    {
        get { return selectedPerson; }
        set
        {
            selectedPerson = value;
            OnPropertyChanged("SelectedPerson");
        }
    }

    private string string1;
    public string String1
    {
        get { return string1; }
        set
        {
            string1 = value;
            OnPropertyChanged(String1);
        }
    }

    public VM()
    {
        String1 = "abc";

        DataSource = new ObservableCollection<Person>();
        DataSource.Add(new Person { FirstName = "Alpha", LastName = "Apple" });
        DataSource.Add(new Person { FirstName = "Beta", LastName = "Banana" });
        DataSource.Add(new Person { FirstName = "Charlie", LastName = "Cucumber" });
    }

    public ICommand SetSelectedCommand => new RelayCommandBase(SetSelected);
    private void SetSelected(object parameter = null)
    {
        SelectedPerson.FirstName = String1;
        SelectedPerson = SelectedPerson;    // force setter to run
        DataSource = DataSource;            // force ObservableCollection setter to run
    }
}

最佳答案

Person类应该实现 INotifyPropertyChanged界面:

public class Person : INotifyPropertyChanged
{
    private string _firstName;
    public string FirstName
    {
        get { return _firstName; }
        set
        {
            _firstName = value;
            NotifyPropertyChanged();
        }
    }

    private string _lastName;
    public string LastName
    {
        get { return _lastName; }
        set
        {
            _lastName = value;
            NotifyPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

关于WPF DataGrid 在代码中更新其 ItemsSource 时不更新 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48344395/

相关文章:

WPF 总是在父级的顶部

c# - EntityFramework 和 DataAnnotations,错误未显示

c# - WPF MVVM 更新源但不更新 GUI

wpf - 阻止用户选择/取消选择 WPF DataGrid 中的行

c# - 使用 foreach 遍历 WPF DataGrid

.net - 如何删除WPF中折线图周围的边框?

wpf - 沿路径对对象进行动画处理

c# - 如何在MVVM中显示WPF数据网格中的数据

wpf - 我应该在哪里定义我的数据模板?

c# - Datagrid 双向绑定(bind)不起作用