Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到ViewModels或业务模型集合?_C#_Wpf_Binding_Mvvm_Listbox - Fatal编程技术网

C# 绑定到ViewModels或业务模型集合?

C# 绑定到ViewModels或业务模型集合?,c#,wpf,binding,mvvm,listbox,C#,Wpf,Binding,Mvvm,Listbox,请帮助我更好地理解MVVM: 我一直在将列表框绑定到自定义对象列表,但后来在多选列表中正确填充/绑定选定项时遇到了一些问题 我发现的解决方案只是为列表框使用了一个列表(或者至少我是这么理解的),然后viewmodel类可以有一个IsSelected属性,这对我来说很有用 我的问题是:将列表框绑定到视图模型列表是否常见?这看起来很奇怪,如果ti是正常的,那么将列表框绑定到业务对象列表是不是一种糟糕的MVVM技术 最后,当我将一个列表框绑定到此viewmodels列表时,这些视图模型通常如何链接回它

请帮助我更好地理解MVVM:

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

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

我的问题是:将列表框绑定到视图模型列表是否常见?这看起来很奇怪,如果ti是正常的,那么将列表框绑定到业务对象列表是不是一种糟糕的MVVM技术

最后,当我将一个列表框绑定到此viewmodels列表时,这些视图模型通常如何链接回它们所表示的业务对象列表?我是否在视图模型中保留id,或对业务对象本身的引用?很抱歉提出这些问题,但我正在努力学习MVVM并正确使用它

下面是我放入列表并绑定到列表框的viewmodel:

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; }
}
公开用户列表
{
获取{返回this.users;}
设置{this.users=value;}
}

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

您所做的似乎很好

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

另外,如果希望WPF在ViewModels或模型中的属性更改时自动更新其UI,请确保它们实现了。如果希望它们在集合更改时自动更新,请确保使用而不是
列表


我开始学习MVVM,这是对设计模式的一个很好的介绍,尽管我刚开始学习时很难理解它。如果你想找更简单的东西,你可以看看我写的WPF,Silverlight或WP7?WPF,作为标签添加,不认为它重要。我也不认为它重要;我只是好奇地问:)如果用户列表可以在运行时更改,那么使用ObservableCollection。如果ItemViewModels属性可以更改,则实现INotifyPropertyChanged。除此之外,你的代码乍一看很好。谢谢你的帮助!我决定在视图模型中有一个对对象的引用(我做了一个泛型)