绑定到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; }
}

绑定到viewmodel或业务模型的集合

你有什么看起来很好

MVVM设计模式背后的思想是保持UI层与业务逻辑层分离。理想的MVVM应用程序可以在任何UI(或者根本没有UI)下运行,所以如果你有某种基于选定用户的业务逻辑,那么你应该在ViewModel上有一个SelectedUsers集合,或者在你的User对象上有一个IsSelected属性。

作为旁注,如果你想让WPF在你的ViewModels或Models中的属性改变时自动更新它的UI,确保它们实现了INotifyPropertyChanged。如果你想让它们在集合变化时自动更新,请确保使用ObservableCollection而不是List

我是通过Josh Smith的这篇文章开始学习MVVM的,这篇文章很好地介绍了设计模式,尽管在我刚开始学习的时候,我很难理解它。如果您正在寻找更简单的东西,您可以查看我编写的简单MVVM示例

此外,您的ViewModel应该实现INotifyPropertyChanged,以便它可以通知视图的任何更改。