Добавить элементы в ComboBox программно - PullRequest
2 голосов
/ 09 марта 2012

Я работал с WPF все 2 дня, приходя из ASP.NET, так что терпите меня!

Я заполняю ComboBox с именами файлов xml из каталога и добавляю значок к каждому элементу.У меня все работает просто отлично, но мне интересно, есть ли «лучший», более «эффективный» способ сделать это.Как я уже говорил, я только начинаю работать с WPF и хочу поступить «правильно».Мой рабочий код приведен ниже, могу ли я пойти по-другому?Заранее спасибо за любые указатели!

<ComboBox Height="24" HorizontalAlignment="Left" Margin="153,138,0,0" Name="cmbFiles" VerticalAlignment="Top" Width="200" //>
private void FillSrFileCombo()
{
    string[] dirFiles = Directory.GetFiles(@"D:\TestFiles", "*.xml");

    foreach (string datei in dirFiles)
    {
        string fileName = System.IO.Path.GetFileName(datei);

        System.Windows.Controls.StackPanel stkPanel = new StackPanel();
        stkPanel.Orientation = Orientation.Horizontal;
        cmbFiles.Items.Add(stkPanel);

        System.Windows.Controls.Image cboIcon = new Image();
        BitmapImage bitMap = new BitmapImage();
        bitMap.BeginInit();
        bitMap.UriSource = new Uri(@"tag.jpg", UriKind.Relative);
        bitMap.EndInit();
        cboIcon.Source = bitMap;
        cboIcon.Height = 15;
        stkPanel.Children.Add(cboIcon);

        System.Windows.Controls.TextBlock cboText = new TextBlock();
        cboText.Text = " - " + fileName;
        stkPanel.Children.Add(cboText);
    }
}

Ответы [ 3 ]

4 голосов
/ 10 марта 2012

Я ответил на аналогичный вопрос час назад, см. Здесь: /5719134/dobavit-usercontrol-v-spisok.

Я приведу наиболее важные части на основе вашего примера

В XAML вам необходимо создать «DataTemplate»это XAML-представление вашего файлового объекта - в вашем случае изображение + имя файла.Вы можете создать этот Dateatemplate в качестве ресурса и назначить его в ComboBox или просто создать его в выпадающем списке, если вы не планируете использовать его повторно

<ComboBox ItemsSource="{Binding Files}">
  <ComboBox.ItemTemplate>
    <StackPanel>
      <Image Source="{Binding FileImage}" Height="16" Width="16"/>
      <TextBlock Margin="5" Text="{Binding FileName}" />
    </StackPanel>
  </ComboBox.ItemTemplate>
</ComboBox>

В вашем Codebehind вам необходимо создать структуру, котораяпредставляет данные, которые вы хотите представить в своем комбинированном списке - скажем, класс FileInfo.Класс FileInfo должен представлять «FileImage» и «FileName» как свойства, чтобы вы могли связываться с ними (как показано выше).Затем вам нужно создать коллекцию таких объектов в коде позади xaml, в который вы помещаете свой ComboBox. Коллекция должна быть ObservableCollection.

Таким образом, вы могли бы получить что-то вроде этого:

public class FileInfo
 {
     public ImageSource FileImage { get; set; }
     public string FileName { get; set; }
 }

, а затем в MainWindow.xaml.cs

public ObservableCollection Files {get;приватный набор;} public MainWindow () {InitializeComponent ();this.DataContext = this;Files = new ObservableCollection ();

foreach (string datei in dirFiles)
{
   var fName = System.IO.Path.GetFileName(datei);
   BitmapImage bitMap = new BitmapImage();
   bitMap.BeginInit();
   bitMap.UriSource = new Uri(@"tag.jpg", UriKind.Relative);
   bitMap.EndInit();
   Files.Add(new FileInfo(){FileName=fName, FileImage = bitMap});
}

}

Вам все еще нужно будет прочитать много о , почему это будет работать.Я рекомендую прочитать о DataTemplates DataBinding, ObservableCollection и в конце прочитать о MVVM, шаблоне, который прекрасно связывает все эти вещи и позволяет вам использовать всю мощь WPF и отделять вашу логику от пользовательского интерфейса.

3 голосов
/ 09 марта 2012

Один из способов, который следует учитывать для приложений WPF / Silverlight / WP7, - это шаблон проектирования MVVM .

В этом случае у вас будет модель представления, содержащая набор элементов для вашего ComboBox, и вы будете использовать связывающее выражение для установки ItemsSource для ComboBox. Затем вы бы template the ComboBox отобразили изображения ваших предметов.

1 голос
/ 09 марта 2012

Изучите привязку данных и шаблонизаторы данных , единственный код C #, который вам нужен здесь, - это получить файлы (даже если вы можете сделать это в XAML, используяObjectDataProvider)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...