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