以编程方式将项添加到ComboBox

时间:2012-03-09 19:46:54

标签: c# wpf xaml combobox

我一直在和WPF一起工作2天,来自ASP.NET,所以请耐心等待我!

我正在使用目录中的xml文件名填充ComboBox,并为每个项添加一个图标。我有一切工作正常,但我想知道是否有一个“更好”,更“有效”的方式这样做。正如我所说,我刚刚开始使用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 个答案:

答案 0 :(得分:4)

我在一小时前回答了类似的问题,请点击此处:http://stackoverflow.com/questions/9637514/add-usercontrol-to-listbox-wpf。

我将根据您的示例

重温这里最重要的部分

在XAML中,您需要创建一个“DataTemplate”,即文件对象的XAML表示形式 - 在您的情况下是图像+文件名。您可以将此Datatemplate创建为资源并将其分配给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”公开为属性,以便绑定它们(如上所示)。 接下来,您需要在放置ComboBox的xaml的代码隐藏中创建此类对象的集合。集合需要是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功能并从UI中分离逻辑。

答案 1 :(得分:3)

对于WPF / Silverlight / WP7应用,您应该考虑的一种方法是MVVM design pattern

在这种情况下,您将拥有一个包含ComboBox项目集合的视图模型,您可以使用绑定表达式来设置ItemsSource的{​​{1}}。然后,您template ComboBox显示商品图片。

答案 2 :(得分:1)

查看data bindingdata templating,您需要的唯一C#代码是获取文件(即使您也可以使用类似ObjectDataProvider的内容在XAML中执行此操作)