包装面板中用户控件的WPF MVVM动态集合

包装面板中用户控件的WPF MVVM动态集合,wpf,mvvm,Wpf,Mvvm,我是WPF新手,但创建了一个带有包装面板的窗口,其中包含从代码隐藏动态添加的用户控件实例的集合。每个用户控件最终将显示数据库调用返回的行中的数据。我想让它跟随MVVM,但我对架构有点执着。我想我需要一个用于用户控件的视图模型和一个用于窗口的视图模型,该窗口将拥有一个用户控件视图模型的可观察集合。如何将其绑定到视图端的wrap面板,以便wrap面板可以看到用户控件视图模型的集合,并知道如何为集合中的每个实例建立用户控件 我认为,一旦这些都正确绑定,我就可以创建一个后台工作程序,定期查询数据库并创建

我是WPF新手,但创建了一个带有包装面板的窗口,其中包含从代码隐藏动态添加的用户控件实例的集合。每个用户控件最终将显示数据库调用返回的行中的数据。我想让它跟随MVVM,但我对架构有点执着。我想我需要一个用于用户控件的视图模型和一个用于窗口的视图模型,该窗口将拥有一个用户控件视图模型的可观察集合。如何将其绑定到视图端的wrap面板,以便wrap面板可以看到用户控件视图模型的集合,并知道如何为集合中的每个实例建立用户控件

我认为,一旦这些都正确绑定,我就可以创建一个后台工作程序,定期查询数据库并创建/更新用户控件视图模型对象,如果我从INotifyPropertyChanged继承并在我的用户控件视图模型中触发属性更改事件,则所有内容都应该根据绑定进行更新。听起来对吗

我见过一些基本的例子,比如绑定到列表框的字符串的observablecollection,但是我很难将其应用到更复杂的情况。任何关于总体架构或我应该从哪里开始的建议都非常感谢

您正在查找ItemsControl类吗?将ItemsControl.ItemTemplate设置为ItemUserControlViewModel->item用户控件视图的DataTemplate。和ItemsControl.ItemsPanel设置为anItemsPanelTemplate,并带有WrapPanel


ItemControl的ItemsSource属性将绑定到WindowViewModel中的ObservableCollection。

基本上,您需要一个可枚举控件,该控件在ObservableCollection中的每个元素都有一个项。需要对控件的项进行模板化,以便使用自定义控件显示数据

为此,创建一个ObservableCollection,它保存您的数据对象,并将其用作ListBox的ItemsSource。然后需要更改列表框,以在包装中而不是在默认布局中显示其项。修改ListBox的ItemTemplate以对每个列表项使用自定义用户控件

视图模型:

public class WindowViewModel
{
     public ObservableCollection<MyDatabaseObject> DatabaseObjects { get; set; }
}


public class MyDatabaseObject : INotifyPropertyChanged
{
     public event PropertyChangedEventHandler PropertyChanged;

     public string DbName 
     { 
         get { return _dbName; }
         set { 
                _dbName = value;
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs("dbName");
         } 
     }

     private _dbName;
}
Xaml:


谢谢-ObservableCollection和DataTemplate是我所遇到的难题的一部分missing@jav1981如果你收到满意的答复,请接受。
 <Grid>
    <ListBox ItemsSource="{Binding DatabaseObjects}">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <WrapPanel/>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <MyUserControl Title="{Binding DbName}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>