【问题标题】:Binding to collections of ViewModels or business models?绑定到 ViewModel 或业务模型的集合?
【发布时间】:2011-12-14 16:59:38
【问题描述】:

请帮助我更好地理解 MVVM:

我一直在将列表框绑定到自定义对象列表,但后来在多选列表中正确填充/绑定所选项目时遇到了一些麻烦。

我发现的解决方案只为那个列表框使用了一个 List,(或者至少我是这么理解的),然后 viewmodel 类可以有一个 IsSelected 属性,这对我有用。

我的问题是:将列表框绑定到视图模型列表是否常见?看起来很奇怪,如果 ti 正常,是否将列表框绑定到业务对象列表是不好的 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>`

这是视图模型中的用户属性

public List<ItemViewModel> Users
{
    get { return this.users; }
    set { this.users = value; }
}

【问题讨论】:

  • WPF、Silverlight 还是 WP7?
  • WPF,加了标签,觉得没关系。
  • 我认为这也不重要;我只是出于好奇而问:)
  • 如果用户列表可以在运行时更改,则使用 ObservableCollection。如果 ItemViewModels 属性可以更改,则实施 INotifyPropertyChanged。除此之外,您的代码乍一看还不错。

标签: c# wpf binding mvvm listbox


【解决方案1】:

你所拥有的似乎很好

MVVM 设计模式背后的理念是将您的 UI 层与业务逻辑层分开。一个理想的 MVVM 应用程序可以使用任何 UI(或根本没有 UI)运行,因此如果您有某种基于 Selected Users 的业务逻辑,那么您应该在 ViewModel 上有一个 SelectedUsers 集合,或者一个 IsSelected您的 User 对象上的属性。

附带说明,如果您希望 WPF 在您的 ViewModel 或 Model 中的属性发生更改时自动更新其 UI,请确保它们实现 INotifyPropertyChanged。如果您希望它们在集合更改时自动更新,请确保使用 ObservableCollection 而不是 List

我从 this article by Josh Smith 开始学习 MVVM,这是对设计模式的一个很好的介绍,尽管当我刚开始时我很难理解它。如果您正在寻找更简单的东西,可以查看我写的simple MVVM example

【讨论】:

  • 感谢您的帮助!我决定引用视图模型中的对象(我做了一个通用的)
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 1970-01-01
    • 2013-10-11
    • 2012-12-10
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多