绑定到viewmodel或业务模型的集合
本文关键字:模型 集合 业务 viewmodel 绑定 | 更新日期: 2023-09-27 18:17:56
请帮助我更好地理解MVVM:
我一直在将列表框绑定到自定义对象列表,但后来我遇到了一些麻烦,无法在多选择列表中正确填充/绑定所选项目。
我发现的解决方案使用List只是为了列表框,(或至少这是我所理解的),然后视图模型类可以有一个IsSelected属性,这对我来说是有效的。
我的问题是:将列表框绑定到视图模型列表是常见的吗?这看起来很奇怪,如果这是正常的,那么将列表框绑定到业务对象列表是坏的MVVM技术吗?
最后,当我将一个列表框绑定到这个视图模型列表时,这些列表通常如何链接回它们所代表的业务对象列表?是在视图模型中保留id,还是对业务对象本身的引用?很抱歉这些问题,但我正在努力学习MVVM并把它做好。
下面是我放入列表并绑定到列表框的视图模型:
class ItemViewModel
{
public ItemViewModel(string name)
{
Name = name;
}
public string Name { get; private set; }
bool isSelected;
public bool IsSelected
{
get {
return isSelected;
}
set {
isSelected = value;
}
}
}
下面是视图
中列表框的xaml<ListBox Height="401" ItemsSource="{Binding Path=Users}" ItemTemplate="{StaticResource listBoxTemplate}" SelectionMode="Multiple" HorizontalAlignment="Left" Margin="202,29,0,0" Name="lbxAuthorizedUsers" VerticalAlignment="Top" Width="154" >
<ListBox.ItemContainerStyle>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="IsSelected" Value="{Binding Mode=TwoWay, Path=IsSelected}"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>`
这是视图模型中的Users属性
public List<ItemViewModel> Users
{
get { return this.users; }
set { this.users = value; }
}
你有什么看起来很好
MVVM设计模式背后的思想是保持UI层与业务逻辑层分离。理想的MVVM应用程序可以在任何UI(或者根本没有UI)下运行,所以如果你有某种基于选定用户的业务逻辑,那么你应该在ViewModel上有一个SelectedUsers
集合,或者在你的User对象上有一个IsSelected
属性。
作为旁注,如果你想让WPF在你的ViewModels或Models中的属性改变时自动更新它的UI,确保它们实现了INotifyPropertyChanged。如果你想让它们在集合变化时自动更新,请确保使用ObservableCollection而不是List
我是通过Josh Smith的这篇文章开始学习MVVM的,这篇文章很好地介绍了设计模式,尽管在我刚开始学习的时候,我很难理解它。如果您正在寻找更简单的东西,您可以查看我编写的简单MVVM示例
此外,您的ViewModel应该实现INotifyPropertyChanged,以便它可以通知视图的任何更改。