Программно заполнить стековую панель наблюдаемой коллекцией пользовательских элементов управления, используя MVVM - PullRequest
2 голосов
/ 13 июля 2011

У меня есть наблюдаемая коллекция типа frameworkelement, которую я хотел бы отобразить в панели стека или что-то подобное.Каждый элемент в наблюдаемой коллекции - это пользовательский контроль, который я создал.Я довольно новичок в WPF и понятия не имею, как это сделать.Пример будет высоко ценится

Ответы [ 2 ]

4 голосов
/ 13 июля 2011

Я немного заимствую ответ rhe1980 здесь, но дело в том, что код в коде на самом деле будет в модели представления.

Вид:

<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>

CodeBehind:

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

ViewModel:

    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");
        }
    }     
}
2 голосов
/ 13 июля 2011

Использование ItemsControl для связывания ObservableCollection в StackPanel:

Вид (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>

CodeBehind (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()});
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...