2014-02-05 5 views
0

В моем приложении WPF есть список с несколькими элементами. На каждом элементе у нас есть изображение и текстовое поле.Добавление нескольких элементов в список. C#, WPF

См XAML ниже:

 <ListBox x:Name="lstMagic" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10,200,10,0" Width="Auto" Height="558" Background="{x:Null}" BorderBrush="Transparent"> 

      <ListBoxItem> 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="images/plates/pig.jpg" Margin="0,0,5,0" Width="72"/> 
        <TextBox IsReadOnly="True" Background="{x:Null}" Foreground="White" Width="912">Some Magic is going to happen</TextBox> 
       </StackPanel> 
      </ListBoxItem> 

Так что список начинается с свиней, как и ожидалось. В передней части свиньи он загружает pig.jpg успешно.

В этом разделе формы у меня есть кнопка. Я смог сделать волшебство на этой кнопке, чтобы добавить новый listBoxItem.

 private void btnDoMagic(object sender, RoutedEventArgs e) 
    { 
     ListBoxItem newMagic = new ListBoxItem(); 
     Image imageCurrent = new Image(); 
     imageCurrent.Source = new BitmapImage(new Uri("images/plates/someOtherImage.jpg", UriKind.RelativeOrAbsolute)); 
     newMagic.Content = imageCurrent; 
     lstCardapio.Items.Add(newMagic); 
    } 
} 

Эта функция работает и успешно добавляет изображение в список! Но у меня есть некоторые вопросы: Как я могу сделать так же, как мой первый XAML? Изображение и текстовое поле? Как я могу добавить их на событие с моей кнопкой?

Мне нужно это сделать, потому что мы получим эти элементы из нашей базы данных, поэтому мы должны загружать их динамически.

+1

Не создавайте элементы пользовательского интерфейса или не манипулируйте ими в процедурный код в WPF. Для этого и предназначен XAML. Создайте правильный ViewModel с помощью 'ObservableCollection ' и привяжите 'ListBox.ItemsSource' к этой коллекции. Затем используйте свойство «ListBox.ItemTemplate», чтобы определить, как будет выглядеть пользовательский интерфейс для каждого элемента. –

+1

, потому что WPF не предназначен для использования таким образом. У вас будет много ненужного, сложного для ведения кода. Создайте правильный ViewModel, и все ваши проблемы будут волшебным образом исчезнуть. –

+1

См. [Этот ответ] (http://stackoverflow.com/a/21315083/643085) –

ответ

2

Если я правильно понял, вы хотели бы дублировать именно вашу иерархию XAML, за исключением кода, а затем добавить его в ListBox?

Если вы хотите создать элементы управления в-кода в этой точке просто прямо вверх, вы могли бы использовать что-то вроде этого:

// This method creates your controls and returns a listBoxItem with the specified content. 
    private ListBoxItem createObject(String imgSource, String text) 
    { 
     var newImage = new Image() 
      { 
       Source = new BitmapImage(new Uri(imgSource, UriKind.RelativeOrAbsolute)), 
       Width = 72, 
       Margin = new Thickness(0, 0, 5, 0) 
      }; 
     var newTextBox = new TextBox() 
      { 
       IsReadOnly = true, 
       Background = Brushes.Transparent, 
       Foreground = Brushes.White, 
       Width = 912, 
       Text = text 
      }; 

     var newStackPanel = new StackPanel() { Orientation = Orientation.Horizontal }; 

     newStackPanel.Children.Add(newImage); 
     newStackPanel.Children.Add(newTextBox); 

     return new ListBoxItem() { Content = newStackPanel }; 
    } 


    private void btnDoMagic(object sender, RoutedEventArgs e) 
    { 
     // Get your URI and textbox text here, and use them as arguments below. 

     1stMagic.Items.Add(createObject("Sample URI", "Sample Textbox Content")); 
    } 

Конечно, это не особенно аккуратным и требует, чтобы вы знаете о чем в XAML это соответствует тому, когда вы его изменяете, и вы теряете контроль над элементами управления, как только вы покидаете обработчик событий (поскольку у них нет имен или способов прямого доступа к ним), но он должен работать.

Если вы хотите изменить созданные объекты, вы можете выполнить итерацию через 1stMagic.Items или добавить созданные элементы управления в закрытый внутренний список, который вы поддерживаете в коде и управляете им таким образом.

+0

Это решило. Но, как сказал @HighCore, лучше создать привязки ... Я изучаю это. Во всяком случае, этот ответ решил сам вопрос, и это очень помогло! Благодаря! – Malavos

Смежные вопросы