【问题标题】:WPF Prism DataGrid not updatedWPF Prism DataGrid 未更新
【发布时间】:2018-12-29 20:00:21
【问题描述】:

我对 Prism MVVM 中的 DataGrid 有疑问。

当我在其他窗口中编辑实体时,我创建的新窗口 DataGrid 未更新。只能再次运行应用程序帮助。这是我的代码:

<DataGrid Name="ClientsTable" IsReadOnly="True" ItemsSource="{Binding Path=ListOfClients, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn" Margin="22,10,22,55" Width="800"/>

此窗口的部分 ViewModel:

public ListOfClientsViewModel(IClientService clientService, IEventAggregator eventAggregator)
{
    this.clientService = clientService;
    this.eventAggregator = eventAggregator;
    ListOfClients.AddRange(clientService.GetAllClientsForList());
}

private ObservableCollection<ClientForList> listOfClients = new ObservableCollection<ClientForList>();
public ObservableCollection<ClientForList> ListOfClients
{
    get { return listOfClients; }
    set { SetProperty(ref listOfClients, value); }
}

以及收藏中的模型的一部分。它在其他项目中。

public class ClientForList : INotifyPropertyChanged
{
    private string id;
    private string name;
    private string firstname;
    private string lastname;
    private string city;
    private DateTime createdDate;


    [DisplayName("Numer klienta")]
    public string Id
    {
        get { return id; }
        set
        {
            if (value != id)
            {
                id = value;
                OnPropertyChanged();
            }
        }
    }
    [DisplayName("Nazwa")]
    public string Name
    {
        get { return name; }
        set
        {
            if (value != name)
            {
                name = value;
                OnPropertyChanged();
            }
        }
    }
    [DisplayName("Imię")]
    public string Firstname
    {
        get { return firstname; }
        set
        {
            if (value != firstname)
            {
                firstname = value;
                OnPropertyChanged();
            }
        }
    }
    [.....]

    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

并且,当我在其他窗口中编辑实体时,我会通过以下方式使用 DataGrid 打开窗口:

void ExecuteListOfClients()
{
    ListOfClients listOfClientsWindow = new ListOfClients();
    listOfClientsWindow.DataContext = new ListOfClientsViewModel(IClientService, EventAggregator);
    listOfClientsWindow.ShowDialog();
}

DataGrid 中的数据很旧。当我重新启动应用程序数据是实际的。救命!

【问题讨论】:

    标签: c# wpf mvvm datagrid prism


    【解决方案1】:

    代替

    set { SetProperty(ref listOfClients, value); }
    

    set { SetProperty(listOfClients, value); }
    

    而不是

    ListOfClients.AddRange(clientService.GetAllClientsForList());
    

    ListOfClients = clientService.GetAllClientsForList().ToObservableCollection();
    

    您可能需要实现扩展ToObservableCollection()。 另一种解决方案是将属性 ListOfClients 更改为普通的 IList,然后在视图模型中实现 INotifyPropertyChanged

    【讨论】:

    • SetProperty(listOfClients, value); 甚至无法编译。
    【解决方案2】:

    好的,我解决了部分问题。

    我已经在没有手动创建 ViewModel 的情况下剪切了窗口创建:

    void ExecuteListOfClients()
    {
        ListOfClients listOfClientsWindow = new ListOfClients();
        listOfClientsWindow.ShowDialog();
    }
    

    在 xaml ListOfClients.xaml 中我改为:

    prism:ViewModelLocator.AutoWireViewModel="True"
    

    现在,重新打开窗口后,它会显示刷新的数据;)

    但是还是有问题。我已经完成了 LoadData 方法,该方法在构造函数中完成并将数据分配给 ObservableCollection。有用。我已经为它设置了一个按钮,在编辑客户端后我点击加载新数据,不幸的是没有任何反应。将来我希望在编辑客户端后从 EventAggregator 调用此方法,但现在我制作了一个按钮进行测试,不幸的是它不起作用。

    【讨论】:

      【解决方案3】:

      它有效。问题不在于 WPF 本身,也不是奇怪的视图。问题在于 EntityFramework。我不得不修改从数据库中选择数据到集合的命令:

      var clients = db.Clients.AsNoTracking().ToList();
      

      【讨论】:

        猜你喜欢
        • 2015-12-04
        • 1970-01-01
        • 2012-09-01
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 2018-10-26
        相关资源
        最近更新 更多