2012-03-09 17 views
2

私はWPFで2日間作業しています。ComboBoxにプログラムで追加する

私は、ディレクトリからxmlファイル名でComboBoxを作成し、各アイテムにアイコンを追加しています。私はすべてうまく動作しているが、これを行う "より良い"、より "効率的な"方法があるかどうか疑問に思っている。私が述べたように、私はWPFを使い始めています。私は「正しい」方法で物事について行きたいと思っています。私の作業コードは以下の通りですが、別の方法でこれを行うことができますか?どのポインタについても事前に感謝しています! (あなたもXAMLでObjectDataProviderのようなものを使用していることを行うことができていても)

<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

私は1時間前に似た質問に答えました:http://stackoverflow.com/questions/9637514/add-usercontrol-to-listbox-wpf。

私はそれがあなたのファイルオブジェクトのXAML表現で、あなたは「DataTemplateを」を作成する必要が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; ファイル=新しい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について読んで、UIからすべてのWPFパワーとデアザイロジックを利用できるようにします。

+0

ありがとうAlexDrenea!私は本当に助けに感謝します!いくつかの調整をすることで、あなたのコードは魅力的に機能し、私は間違いなくあなたの推奨する読書を検討します。乾杯! – user10001110101

1

data bindingdata templatingに見て、あなたがここに必要があるの唯一のC#コードは、ファイルを取得することです

+0

応答してくれてありがとう、私が上記と同じものを達成するあなたの提案の例を振り返るのは大変なことでしょうか?私はあなたが示唆し、私を許しているコード例を見ましたが、それは事を複雑にし、より多くのコードを書くことを必要とするようですね??私はここから離れているかもしれません。これが私が求めている理由です:) – user10001110101

+0

@ user1035765:通常は* less *コード*が必要です。*読みやすいです。私はすぐに外出しようとしているので、私はすぐにコードを提供することはできません、いくつかの時間でいくつかを投稿することがあります。 –

+0

おかげさまでH.B.、本当にありがとう! – user10001110101

3

WPF/Silverlight/WP7アプリケーションのために考慮すべき1つの方法はMVVM design patternです。

この場合、ComboBoxのアイテムのコレクションを含むビューモデルがあり、バインディング式を使用してComboBoxItemsSourceを設定します。するとtemplateComboBoxにアイテム画像が表示されます。

関連する問題