WPF Prism DataGrid未更新

时间:2018-07-21 22:34:44

标签: c# wpf mvvm datagrid prism

我在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中的数据很旧。当我重新启动应用程序数据是实际的。救命!

3 个答案:

答案 0 :(得分:0)

代替

set { SetProperty(ref listOfClients, value); }

set { SetProperty(listOfClients, value); }

,而不是

ListOfClients.AddRange(clientService.GetAllClientsForList());

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

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

答案 1 :(得分:0)

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

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

Display *display = XOpenDisplay(nullptr);
int screen = DefaultScreen(display);
Window rootWin = RootWindow(display, screen);
Window qRoot;
Window qChild;
int qRootX;
int qRootY;
int qChildX;
int qChildY;
unsigned int qMask;
while(true)
{
  if(XQueryPointer(display, rootWin, &qRoot, &qChild, &qRootX, &qRootY, &qChildX, &qChildY, &qMask))
  {
    for(int i = 0; i < sizeof(int) * 8; i++)
    {
      int mask = 1 << sizeof(int) * 8 - i - 1;
      if(mask & qMask)
      {
        printf("1");
      }
      else
      {
        printf("0");
      }
    }
    printf("(%d)\n", qMask);
  }
}

在xaml ListOfClients.xaml中,我更改为:

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

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

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

答案 2 :(得分:0)

有效。问题不在于WPF本身,也不足以令人奇怪。问题出在EntityFramework上。我不得不修改从数据库中选择数据到集合的命令:

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