2011-07-13 65 views
2

我有類型的FrameworkElement的一個ObservableCollection,我想在一個StackPanel或類似的東西,以顯示用戶控件的一個ObservableCollection。 observablecollection中的每個項目都是我創建的用戶控件。我對WPF很新,我不知道如何做到這一點。一個例子,將不勝感激編程填充一個StackPanel使用MVVM

+0

MVVM通常會不贊成這種技術,因爲你的視圖模型緊密耦合到視圖,導致在下降的可測性,便攜性等,這是哪裏的ObservableCollection框架元素是從哪裏來的? – NickHeidke

+1

在完美的世界中,viewmodel是一組不關心前端如何實現的屬性集合。通過擁有一個可觀察的FrameworkElement集合,您可以將虛擬機耦合到特定的演示實現。這當然是功能性的。讓我知道下面的答案是否能解決您的問題! :-) – NickHeidke

+1

您的解決方案就像一個魅力!謝謝! – user823486

回答

4

我借用rhe1980的回答有點這裏,但關鍵是是t他在代碼隱藏中的代碼實際上將處於視圖模型中。

查看:

<Window x:Class="Sandbox.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="350" Width="525" 
Name="mainWindow"> 
<Grid> 
<StackPanel> 
    <ItemsControl ItemsSource="{Binding Path=MyCollection}"/>       
</StackPanel>   
</Grid> 

代碼隱藏:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     this.DataContext = new MyViewModel(); 
    } 
} 

視圖模型:

public class MyViewModel: INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string propertyName) 
    { 
     if (!string.IsNullOrEmpty(propertyName)) 
     { 
      if (this.PropertyChanged != null) 
       this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
     this.OnObjectChanged(); 
    } 

    private ObservableCollection<FrameworkElement> _myCollection; 
    public ObservableCollection<FrameworkElement> MyCollection 
    { 
     get 
     { 
      return _myCollection; 
     } 
     set 
     { 
      _myCollection = value; 
      OnPropertyChanged("MyCollection"); 
     } 
    }  
} 
+0

如果您正在使用某種形式的依賴注入,虛擬機實際上可以被傳遞到視圖的構造函數,但是這是一個快速解決方案,如果需要,我可以補充。 – NickHeidke

2

使用的ItemsControl用於綁定在StackPanel中所述的ObservableCollection:

視圖(XAML):

<Window x:Class="Sandbox.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" 
    Name="mainWindow"> 
<Grid> 
    <StackPanel> 
     <ItemsControl ItemsSource="{Binding ElementName=mainWindow,Path=ObservableCollection}"/>       
    </StackPanel>   
</Grid> 

代碼隱藏(xaml.cs):

public partial class MainWindow : Window 
{ 
    public ObservableCollection<FrameworkElement> ObservableCollection { get; set; } 

    public MainWindow() 
    { 
     InitializeObservableCollection(); 
     InitializeComponent(); 
    } 

    private void InitializeObservableCollection() 
    { 
     ObservableCollection = new ObservableCollection<FrameworkElement>(); 
     for (var ii = 0; ii < 10; ii++) 
     { 
      ObservableCollection.Add(new Button {Content = ii.ToString()}); 
     } 
    } 
}