2012-03-09 153 views
2

我一直在使用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); 
    } 
} 

回答

4

我已經在一小時前回答了類似的問題,在這裏看到:http://stackoverflow.com/questions/9637514/add-usercontrol-to-listbox-wpf。

我將在這裏根據你的榜樣

在您需要創建一個「DataTemplate中的」 XAML回顧一下最重要的部分,那就是你的文件對象的XAML表示 - 在你的情況下的圖像+文件名。您可以創建此DataTemplate中作爲一種資源,並將其分配給您的組合框或只是在組合框中創建它,如果你不打算重用

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

在你的代碼隱藏,你需要創建一個represets的結構你想在你的組合框中呈現的數據 - 比方說一個「FileInfo」類。 FileInfo類需要將「FileImage」和「FileName」作爲屬性公開,以便您可以綁定到它們(如上所示)。 接下來,您需要在放置ComboBox的xaml的代碼隱藏中創建這些對象的集合。集合需要是ObservableCollection。

所以,你將有水木清華這樣的:

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

然後在MainWindow.xaml.cs

公衆的ObservableCollection文件{獲得;私人設置; } 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中分離出邏輯。

+0

非常感謝AlexDrenea!我非常感謝幫助!通過一些調整,你的代碼就像一個魅力,我一定會看看你的推薦閱讀。乾杯! – user10001110101 2012-03-09 21:56:01

1

查找到data bindingdata templating,唯一的C#代碼,如果您需要在這裏獲得的文件(即使你也能做到這一點在XAML中使用類似的ObjectDataProvider

+0

感謝您的迴應,掀起您的建議的例子,完成我以上同樣的事情,是否太麻煩了?我看過你所建議和原諒我的代碼示例,但它看起來過於複雜,並且需要編寫更多代碼?我可能會離開這裏,這就是爲什麼我問:) – user10001110101 2012-03-09 20:18:48

+0

@ user1035765:它通常需要* less * code *和*它更具可讀性。我現在無法提供代碼,因爲我即將出頭,可能會在幾個小時內發佈一些代碼。 – 2012-03-09 20:21:06

+0

感謝H.B.,我真的很感激它! – user10001110101 2012-03-09 20:38:04

3

您應該考慮WPF/Silverlight/WP7應用程序的一種方法是MVVM design pattern

在這種情況下,你將有一個包含項目的集合爲您ComboBox視圖模型,你就可以使用綁定表達式來設置ComboBoxItemsSource。然後您將templateComboBox顯示您的項目圖像。

相關問題