2012-04-08 29 views
0

我是WPF的新手,但创建了一个包装面板的窗口,其中包含从代码后面动态添加的用户控件实例的集合。每个用户控件将最终显示数据库调用返回的行中的数据。我想让它遵循MVVM,但是有点卡在这个架构上。我想我需要有一个用户控件的视图模型和一个窗口的视图模型,它将拥有用户控件视图模型的observable集合。如何将绑定到视图侧的包装面板,以便包装面板看到用户控件视图模型的集合,并知道为集合中的每个实例建立用户控件?WPF MVVM用户控件在包装面板中的动态集合

我认为一旦这是所有绑定正常,我可以做一个后台工作,定期查询数据库和创建/更新用户控制视图模型对象,如果我从INotifyPropertyChanged继承和触发属性更改事件在我的用户控制视图模型应该基于绑定来更新所有内容。这听起来正确吗?

我见过一些基本的例子,例如绑定到列表框的字符串的observablecollection,但我在将它应用于更复杂的情况时遇到了麻烦。对于一般架构或我应该着手开始的任何建议都非常感谢!

回答

2

您是否在寻找ItemsControl的课程?对于ItemUserControlViewModel( - > item用户控件视图),ItemsControl.ItemTemplate设置为DataTemplate。并ItemsControl.ItemsPanel设置为ItemsPanelTemplateWrapPanel

ItemControl的ItemsSource属性将从WindowViewModel绑定到您的ObservableCollection<ItemUserControlViewModel>

8

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

为此,请创建一个ObservableCollection,它包含您的数据对象并将其用作ListBox的ItemsSource。然后需要更改列表框以将其项目显示在WrapPanel中而不是默认布局中。修改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:

<Grid> 
    <ListBox ItemsSource="{Binding DatabaseObjects}"> 
     <ListBox.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel/> 
      </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <MyUserControl Title="{Binding DbName}"/> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
</Grid> 
+0

谢谢你 - 的ObservableCollection和DataTemplate的是我错过了 – jav1981 2012-04-09 22:21:20

+0

@ jav1981如果您收到了满意的回答,请接受拼图的碎片它。 – 2012-04-13 22:23:49