gpt4 book ai didi

c# - WPF Entity Framework 刷新一个上下文实体

转载 作者:行者123 更新时间:2023-12-03 10:26:27 25 4
gpt4 key购买 nike

我有一个简单的 MVVM WPF 应用程序,它带有数据库优先的 EF dbContext(在我的应用程序中是 Global.Database),它在我的应用程序中长期存在。
我有一个带有 ItemsSource 列表框的窗口绑定(bind)到名为 Clients 的 viewmodel 属性这是一个 ObservableCollection我的 dbmodel Client .
SelectedItem此列表框的属性绑定(bind)到名为 SelectedClient 的 viewmodel 属性。 .

Client实体类有一个字段叫last_status这是我数据库中的一个简单整数。

因此,在我看来,当我从列表框中选择客户端时,标签绑定(bind)到 SelectedClient 的 last_status应该显示 last_status 的值.

我在 View 模型中添加了一个按钮和一个刷新命令。我想要的是:当我手动更改 last_status对于我数据库中的客户端并在我的 View 中按刷新按钮,标签的内容应该改变。但我完全不知道如何实现这一目标。这是我的 View 模型代码的一部分(我使用 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在数据库中手动设置值并按刷新按钮没有任何 react 。但是当我在列表框中选择另一个客户端然后返回到所需的客户端时 - 标签内容更新正确。我知道,也许我错过了一些非常愚蠢和简单的事情,但我无法弄清楚到底是什么。也许我需要强制改变 SelectedClient在我的按钮命令处理程序中,或调用 SelectedClient s setter 不知何故...
请帮我。非常感谢。

最佳答案

好吧,我发现我的代码出了什么问题。

我的数据绑定(bind)设置为 SelectedClient.last_status .由于某种原因,它没有按我的预期工作。所以我创建了一个名为 LastStatus 的新 View 模型属性并修改了我的 RefreshClientInfo:

 private void RefreshClientInfo(Client client)
{
Global.Database.Entry(client).Reload();
LastStatus = client.last_status;
SetValue(SelectedClientProperty, client);
}

并将标签绑定(bind)到这个新属性。现在一切正常。

关于c# - WPF Entity Framework 刷新一个上下文实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42436759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com