gpt4 book ai didi

c# - 如何替换静态 ObservableCollection 以便以 MVVM 方式在所有窗口上访问它

转载 作者:太空宇宙 更新时间:2023-11-03 19:24:56 27 4
gpt4 key购买 nike

Atm 我得到了一个带有静态 ObservableCollection 的类(somerandomclasss):

public static ObservableCollection<PersonViewModel> thepeoplelist = new ObservableCollection<PersonViewModem>();

但是,我正在将我的项目转换为 MVVM,当然这不是填充所有项目控件(主要是 ListView )的好方法我有多个窗口以这种方式使用此源。

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
lsvallthepeople.ItemSource = somerandomclasss.thepeoplelist;
}

然后 ListView 显示所有拥有该信息的人。然而,这不是我敢打赌的 MVVM 方式,而且我还没有找到一个没有公共(public)静态 ObservableCollection 的好方法,但是有一个窗口,您可以在其中获得一个 ListView ,您可以在其中编辑人员,他们会在 SQL 中更新数据库和 PersonViewModel(获得 INotifyPropertyChanged)。

如果您需要更多信息,请随时询问 ofc :)。

最佳答案

我相信您要问的是,“在 MVVM 中跨多个 View 共享项目列表的最佳方式是什么?”所以我会这样回答问题。

假设您有一项服务可以提供获取人员列表的方法。您将其称为“PersonViewModel”,但您可能会将域实体与 ViewModel 混淆。在 MVVM 中,您有一个代表 UI 控件或屏幕的 View 。然后你有一个 ViewModel,它绑定(bind)到 View 并将 View 连接到数据/域模型。 ViewModel 可以具有许多 View 将绑定(bind)到的公共(public)属性,包括调用服务以从您的数据模型填充这些属性的方法。在您的情况下,我将有一个 View + ViewModel,并且 ViewModel 具有类“Person”的 ObservableCollection 属性。

以下代码是对其实际外观的解释。并非所有内容都已实现。

public class MyViewModel : INotifyPropertyChanged
{
public ObservableCollection<Person> People { get; set; }

public MyViewModel()
{
this.People = new ObservableCollection<Person>();
this.LoadPeople();
}

private void LoadPeople()
{
this.People.Clear();
// Have your logic here that loads the people collection
}
}

就管理单个列表而言,我建议将人员集合缓存在 View 模型可访问的某种静态类或单例中。然后上面的 LoadPeople 方法可以从缓存中提取。您甚至可以延迟加载缓存,使其在第一次访问之前不会发出服务请求。

internal static class SystemContext
{
private static ObservableCollection<Person> _people = null;
public static ObservableCollection<Person> People
{
get
{
if( _people == null )
{
_people = new ObservableCollection<Person>();
// load the list here from a service or something
}

return _people;
}
}
}

所以在您的 ViewModel 中,LoadPeople 看起来像这样:

public void LoadPeople()
{
this.People.Clear();

foreach( Person person in SystemContext.People )
{
this.People.Add( person );
}
}

您的 UI 将如下所示:

<ListBox 
ItemsSource={Binding Path=People, Mode=OneWay}
SelectedItem={Binding Path=SelectedPerson, Mode=TwoWay}
>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Path=PersonName, Mode=OneWay}" />
<TextBlock Text="{Binding Path=DateOfBirth, Mode=OneWay}" />
<!-- etc -->
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

关于c# - 如何替换静态 ObservableCollection 以便以 MVVM 方式在所有窗口上访问它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500240/

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