2012-04-08 65 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