WPF Entity Framework 刷新一个上下文实体
WPF Entity Framework refresh one context entity
我有一个简单的 MVVM WPF 应用程序,它具有数据库优先的 EF dbContext(在我的应用程序中是 Global.Database
),它在我的应用程序中长期存在。
我有一个 window 和一个列表框 ItemsSource
绑定到视图模型 属性 称为 Clients
这是我的 dbmodel Client
.[= 的 ObservableCollection
30=]
此列表框的 SelectedItem
绑定到名为 SelectedClient
的视图模型 属性。
在 Client
实体 class 中有一个名为 last_status
的字段,它是我数据库中的一个简单整数。
因此,在我看来,当我 select 来自列表框的客户端时,绑定到 SelectedClient 的 last_status
的标签应该显示 last_status
.
的值
我在视图模型中添加了一个按钮和一个刷新命令。我想要的是:当我在我的数据库中为客户端手动更改 last_status
并在我的视图中按刷新按钮时,标签的内容应该改变。但我完全不知道如何实现这一目标。这是我的视图模型代码的一部分(我使用 Catel,但对于这种情况并不重要):
public ClientManagerWindowViewModel()
{
RefreshClientInfoCommand = new Command(OnRefreshClientInfoCommandExecute);
Clients = new ObservableCollection<Client>();
RefreshClients();
}
public ObservableCollection<Client> Clients
{
get { return GetValue<ObservableCollection<Client>>(ClientsProperty); }
set { SetValue(ClientsProperty, value); }
}
public static readonly PropertyData ClientsProperty = RegisterProperty("Clients", typeof(ObservableCollection<Client>));
public Client SelectedClient
{
get
{return GetValue<Client>(SelectedClientProperty);}
set
{
SetValue(SelectedClientProperty, value);
}
}
public static readonly PropertyData SelectedClientProperty = RegisterProperty("SelectedClient", typeof(Client));
//here is my refresh button command handler:
public Command RefreshClientInfoCommand { get; private set; }
private void OnRefreshClientInfoCommandExecute()
{
RefreshClientInfo(SelectedClient);
}
//and here is my "logic" for working with dbcontext:
private void RefreshClients()
{
var qry = (from c in Global.Database.Clients where c.client_id != 1 select c).ToList();
Clients = new ObservableCollection<Client>(qry);
}
private void RefreshClientInfo(Client client)
{
Global.Database.Entry(client).Reload();
}
我的 XAML 列表框:
<ListBox
x:Name="ClientsListBox"
Grid.Row="1"
Margin="5"
DisplayMemberPath="fullDomainName"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Clients}"
SelectedItem="{Binding SelectedClient}" />
我的 XAML 标签:
<Label Margin="5" Content="{Binding SelectedClient.last_status}" />
对于一个按钮:
<Button Command="{Binding RefreshClientInfoCommand}" Content="↻"/>
目前,当我在数据库中手动更改客户端的 last_status
值并按下刷新按钮时,没有任何反应。但是当我 select 列表框中的另一个客户端然后 return 到需要的客户端 - 标签内容更新正确。我知道,也许我错过了一些非常愚蠢和简单的东西,但我无法弄清楚到底是什么。也许我需要在我的按钮命令处理程序中强制更改 SelectedClient
,或者以某种方式调用 SelectedClient
s setter...
请帮我。非常感谢。
您需要将 SelectedClient
属性 设置为从 EF 查询返回的新 Client
对象。
您可以通过在查询数据库之前存储当前 selected 客户端的 client_id
然后 select 使用此特定的新 Client
对象来做到这一点client_id
。
试试这个:
private void RefreshClients()
{
int? currentlySelectedClientId = (SelectedClient != null) ? SelectedClient.client_id : default(int?);
var qry = (from c in Global.Database.Clients where c.client_id != 1 select c).ToList();
Clients = new ObservableCollection<Client>(qry);
if (currentlySelectedClientId.HasValue)
SelectedClient = Clients.FirstOrDefault(x => x.client_id = currentlySelectedClientId.Value);
}
编辑:确保从数据库中获取更新的记录:
private void RefreshClientInfo(Client client)
{
var newClient = (from c in Global.Database.Clients where c.client_id == client.client_id select c).ToList();
SetValue(SelectedClientProperty, newClient[0]);
}
好吧,我发现我的代码出了什么问题。
我的数据绑定设置为 SelectedClient.last_status
。由于某种原因,它没有像我预期的那样工作。所以我创建了一个名为 LastStatus 的新视图模型 属性 并修改了我的 RefreshClientInfo:
private void RefreshClientInfo(Client client)
{
Global.Database.Entry(client).Reload();
LastStatus = client.last_status;
SetValue(SelectedClientProperty, client);
}
并将标签绑定到这个新 属性。现在一切正常。
我有一个简单的 MVVM WPF 应用程序,它具有数据库优先的 EF dbContext(在我的应用程序中是 Global.Database
),它在我的应用程序中长期存在。
我有一个 window 和一个列表框 ItemsSource
绑定到视图模型 属性 称为 Clients
这是我的 dbmodel Client
.[= 的 ObservableCollection
30=]
此列表框的 SelectedItem
绑定到名为 SelectedClient
的视图模型 属性。
在 Client
实体 class 中有一个名为 last_status
的字段,它是我数据库中的一个简单整数。
因此,在我看来,当我 select 来自列表框的客户端时,绑定到 SelectedClient 的 last_status
的标签应该显示 last_status
.
我在视图模型中添加了一个按钮和一个刷新命令。我想要的是:当我在我的数据库中为客户端手动更改 last_status
并在我的视图中按刷新按钮时,标签的内容应该改变。但我完全不知道如何实现这一目标。这是我的视图模型代码的一部分(我使用 Catel,但对于这种情况并不重要):
public ClientManagerWindowViewModel()
{
RefreshClientInfoCommand = new Command(OnRefreshClientInfoCommandExecute);
Clients = new ObservableCollection<Client>();
RefreshClients();
}
public ObservableCollection<Client> Clients
{
get { return GetValue<ObservableCollection<Client>>(ClientsProperty); }
set { SetValue(ClientsProperty, value); }
}
public static readonly PropertyData ClientsProperty = RegisterProperty("Clients", typeof(ObservableCollection<Client>));
public Client SelectedClient
{
get
{return GetValue<Client>(SelectedClientProperty);}
set
{
SetValue(SelectedClientProperty, value);
}
}
public static readonly PropertyData SelectedClientProperty = RegisterProperty("SelectedClient", typeof(Client));
//here is my refresh button command handler:
public Command RefreshClientInfoCommand { get; private set; }
private void OnRefreshClientInfoCommandExecute()
{
RefreshClientInfo(SelectedClient);
}
//and here is my "logic" for working with dbcontext:
private void RefreshClients()
{
var qry = (from c in Global.Database.Clients where c.client_id != 1 select c).ToList();
Clients = new ObservableCollection<Client>(qry);
}
private void RefreshClientInfo(Client client)
{
Global.Database.Entry(client).Reload();
}
我的 XAML 列表框:
<ListBox
x:Name="ClientsListBox"
Grid.Row="1"
Margin="5"
DisplayMemberPath="fullDomainName"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Clients}"
SelectedItem="{Binding SelectedClient}" />
我的 XAML 标签:
<Label Margin="5" Content="{Binding SelectedClient.last_status}" />
对于一个按钮:
<Button Command="{Binding RefreshClientInfoCommand}" Content="↻"/>
目前,当我在数据库中手动更改客户端的 last_status
值并按下刷新按钮时,没有任何反应。但是当我 select 列表框中的另一个客户端然后 return 到需要的客户端 - 标签内容更新正确。我知道,也许我错过了一些非常愚蠢和简单的东西,但我无法弄清楚到底是什么。也许我需要在我的按钮命令处理程序中强制更改 SelectedClient
,或者以某种方式调用 SelectedClient
s setter...
请帮我。非常感谢。
您需要将 SelectedClient
属性 设置为从 EF 查询返回的新 Client
对象。
您可以通过在查询数据库之前存储当前 selected 客户端的 client_id
然后 select 使用此特定的新 Client
对象来做到这一点client_id
。
试试这个:
private void RefreshClients()
{
int? currentlySelectedClientId = (SelectedClient != null) ? SelectedClient.client_id : default(int?);
var qry = (from c in Global.Database.Clients where c.client_id != 1 select c).ToList();
Clients = new ObservableCollection<Client>(qry);
if (currentlySelectedClientId.HasValue)
SelectedClient = Clients.FirstOrDefault(x => x.client_id = currentlySelectedClientId.Value);
}
编辑:确保从数据库中获取更新的记录:
private void RefreshClientInfo(Client client)
{
var newClient = (from c in Global.Database.Clients where c.client_id == client.client_id select c).ToList();
SetValue(SelectedClientProperty, newClient[0]);
}
好吧,我发现我的代码出了什么问题。
我的数据绑定设置为 SelectedClient.last_status
。由于某种原因,它没有像我预期的那样工作。所以我创建了一个名为 LastStatus 的新视图模型 属性 并修改了我的 RefreshClientInfo:
private void RefreshClientInfo(Client client)
{
Global.Database.Entry(client).Reload();
LastStatus = client.last_status;
SetValue(SelectedClientProperty, client);
}
并将标签绑定到这个新 属性。现在一切正常。