gpt4 book ai didi

C# - 来自数据库的 WPF/WP 绑定(bind) - 正确的方法? MVVM

转载 作者:行者123 更新时间:2023-11-30 18:25:24 25 4
gpt4 key购买 nike

假设我将此类作为模型(从中生成的数据库):

public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public string City { get; set; }
}

ViewModel 中,我有一个 ObservableCollection Customers,它包含数据库中的所有客户:

ObservableCollection<Customer> Customers;

“客户”是从数据库中填充的。

View 中,ListBox 由 Customers 填充:

<ListBox ItemsSource="{Binding Customers}" />

问题来了。假设我想将一个新客户插入数据库,我应该采用什么方法来通过 UI 跟踪更改:

重置 ItemsSource:(当前使用此 - 最糟糕的方法)

ListBoxExample.ItemsSource = null;
ListBoxExample.ItemsSource = Customers;

通过 ObservableCollection 客户跟踪变化

例如,如果我想向数据库中插入一些内容,也将其插入到 Customers 中,UI 将收到有关更改的通知。

还有哪些其他选项?

实现以下目标的最佳 MVVM 方法是什么:

  • 解析JSON数据并插入到本地数据库
  • 从本地数据库中检索数据并用它填充 ListBox/ListView
  • 如果新数据插入数据库或项目被删除/更改,更新列表框/ ListView 中的更改

如果我想在数据库中添加项目,我可以简单地将项目添加到客户列表并将其添加到数据库中。但是,假设我从数据库中删除了一个对象,可观察集合“Customers”将不会收到通知并且会不同步(UI 也不会更新)。有没有一种方法可以更深入地研究 MVVM 结构,而不是在可观察集合和数据库中添加/删除/更改项目,以某种方式使可观察集合跟踪数据库中的更改(例如,如果更改是通过其他应用程序完成的)。

最佳答案

嗯,我不知道您是否需要解决方案,但根据您上次的评论,您并不满意...我将说明我的方法。

public class CustomersVm : INotifyPropertyChange
{ // just to point out, that you're using a VM class here
private ObservableCollection _customers;
public ObservableCollection Customers
{ // since you're binding this to your listbox, DON'T change the reference during runtime
get { return _customers ?? (_customers = new ObservableCollection());
}

// here comes your loading logic
public void RefreshCustomers()
{
var customers = LoadCustomersFromDb(); // contains now a result set of model classes

Customers.Clear(); //Clear the collection instead of creating it again.
foreach(var customer in customers)
Customers.Add(customer);
}
}

现在 XAML 中的用法,如果 WindowDataContext 设置为 CustomersVm 的实例,它就可以工作。 (注意:为了更通用,需要像这样设置父元素的 DataContext。)

<Window DataContext=... >
<ListBox ItemsSource={Binding Customers} />
</Window>

关于C# - 来自数据库的 WPF/WP 绑定(bind) - 正确的方法? MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30159341/

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