2013-08-28 110 views
4

我正在嘗試用圖像填充組合框。它被定義爲:WPF與圖像組合框

<ComboBox SelectedItem="{Binding SelectedLangComboItem}" 
      ItemsSource="{Binding Languages}"> 
    <ComboBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <Image Source="{Binding Image}" /> 
       <TextBlock Text="{Binding Label}" /> 
      </StackPanel> 
     </DataTemplate> 
    </ComboBox.ItemTemplate> 
</ComboBox> 

凡項目是LanguageItem類:現在

public class LanguageItem 
{ 
    public System.Drawing.Bitmap Image { get; set; } 
    public string Label { get; set; } 
    public string Culture { get; set; } 

    public LanguageItem(System.Drawing.Bitmap image, string label, string culture) 
    { 
    Image = image; 
    Label = label; 
    Culture = culture; 
    } 
} 

,在我的ViewModel c'tor我做的:

_Languages = new ObservableCollection<LanguageItem>(); 

    System.Reflection.Assembly app = System.Reflection.Assembly.GetExecutingAssembly(); 
    System.IO.Stream file; 
    file = app.GetManifestResourceStream("MyNamespace.Images.FLAG1.gif"); 
    _Languages.Add(new LanguageItem(new Bitmap(file), "ITALIAN", "it-IT")); 
    file = app.GetManifestResourceStream("MyNamespace.Images.FLAG2.gif"); 
    _Languages.Add(new LanguageItem(new Bitmap(file), "ENGLISH", "en-EN")); 

    this.SelectedLangItem = _Languages[0]; 

圖像被嵌入的資源。在這裏我有兩個問題:

  1. 圖像不顯示;
  2. 沒有選擇該項目時,SelectedLangItem是:

    公共LanguageItem SelectedLangItem { 得到{_SelectedLangItem; } set { if(_SelectedLangItem == value) return;

    _SelectedLangItem = value; 
        this.RaisePropertyChanged("SelectedLangItem"); 
        } 
    } 
    

回答

3

使用

new BitmapImage(new Uri("MyNamespace.Images.FLAG1.gif", UriKind.Relative)); 

,因爲它必須執行有關的ImageSource

而不是選擇:屬性名稱是 「SelectedLangItem」,而在XAML SelectedLangComboItem如果你沒有輸錯。

CODE:

this.RaisePropertyChanged("SelectedLangItem"); 

XAML:

<ComboBox SelectedItem="{Binding SelectedLangComboItem}" 
+0

謝謝@ vitaliy-zadorozhnyy,對於屬性綁定,你是對的!這是一個複製粘貼錯誤! – Barzo

+0

使用以下路徑作爲路徑:「/MyNamespace;component/Images/FLAG1.gif」 – Barzo

3

你的問題是,你正在嘗試的Image綁定到Image.Source屬性,這是ImageSource類型。

最簡單的解決方案是你的實際圖像文件添加到一個文件夾,並在您的課Image屬性更改爲保存這種格式的文件路徑到圖像的字符串:

​​

然後你就可以正確地將此字符串(框架將轉換爲ImageSource對象)綁定到您的DataTemplate中的Image.Source屬性。

+0

我只想指出'Image'屬性返回一個'System.Drawing.Bitmap',它來自WinForms。如果該屬性返回一個WPF'ImageSource',這將正常工作。 –

+0

@AbeHeidebrecht,你指的是誰?如果是我(似乎就像我對你的評論一樣)...我已經知道了,謝謝......如果是問題作者,那麼也許你的評論會更適合,如果它是反而加入他們的問題? – Sheridan

+0

嗨,感謝所有的建議。我有點困惑:-)我將ImageSource設置爲LanguageItem.Image的類型,並按照@ vitaliy-zadorozhnyy的建議更改我的代碼,但圖像仍未顯示。 – Barzo

0

試試下面XAML代碼和綁定圖像列表到組合框...

<Window.Resources> 
     <DataTemplate x:Key="cmbTemplate"> 
      <WrapPanel Margin="0 5 0 5" Height="80"> 
       <Image Width="65" Height="65" Stretch="Fill" Source="{Binding Photo}" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="0,0,15,0"/> 
       <Label Content="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="20"/> 
      </WrapPanel> 
     </DataTemplate> 
    </Window.Resources> 

    <StackPanel HorizontalAlignment="Center"> 
     <Label Content="Dropdown list with Image" HorizontalAlignment="Center" FontSize="30" Margin="20"/> 
     <ComboBox x:Name="lstwithimg" HorizontalAlignment="Center" VerticalAlignment="Top" ItemTemplate="{StaticResource cmbTemplate}" Height="80" Width="400"/> 
    </StackPanel> 

檢查下面...更多理解現場實例...

http://www.codescratcher.com/wpf/wpf-combobox-with-image/