2016-09-28 75 views
0

我正在嘗試學習WPF和MVVM風格的做事。ComboBox打印對象類型

我有一個簡單的練習應用程序,我想在組合框中顯示代碼。

我的代碼

using System; 
using System.Collections.Generic; 
using System.Collections.ObjectModel; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace SteamCodes 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow : Window 
    { 
     private ObservableCollection<Codes> codes; 
     public MainWindow() 
     { 
      InitializeComponent(); 

      codes = new ObservableCollection<Codes>() 
      { 
       new Codes() {CodeID = "1", Code="CODETEXT"} 
      }; 
      steamCode.ItemsSource = codes.ToString(); 
     } 
    } 

    public class Codes 
    { 
     public string CodeID { get; set; } 
     public string Code { get; set; } 
    } 
} 

我的XAML

<Window x:Class="SteamCodes.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:SteamCodes" 
     mc:Ignorable="d" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <ComboBox x:Name="steamCode" ItemsSource="{Binding Source = Codes}" HorizontalAlignment="Left" Height="43" Margin="122,37,0,0" VerticalAlignment="Top" Width="259"/> 
    </Grid> 
</Window> 

目前我的組合框是通過拉動作爲ComboBox中的每個選項是從線「System.Collections.Objectmodel信。 ObservableCollection`1 [SteamCodes.Codes]'

這些字母的每個人都是組合框中的不同下拉選項。

任何想法,我錯了。

+2

'ItemsSource'應綁定到一個數據項目的收集。您正在分配(不綁定)字符串,這是一組字符。您在XAML中的綁定表達式不起作用。請閱讀此處的基礎知識:[數據綁定概述](https://msdn.microsoft.com/zh-cn/library/ms752347(v = vs.110).aspx)。 – Clemens

+0

好的,謝謝,我現在就來看看這個鏈接。 –

+0

它還應該做什麼?您將整個集合放在一個字符串中。您必須編碼的圖片,如果該項目的來源設置爲兩個值,組合框應該如何決定顯示哪個組合框? - > CodeID和代碼 –

回答

4

ComboBoxItemSource必須是項目的集合,而不是字符串:

steamCode.ItemsSource = codes; 

您也可以指定你的項目的屬性必須被視爲在組合框中設置DisplayMemberPath屬性中顯示的值:

steamCode.DisplayMemberPath = "Code"; 

要指定綁定對象的屬性將被用作實際選擇的值,你必須使用SelectedValuePath屬性:

steamCode.SelectedValuePath = "CodeID"; 

的MVVM的做法是這樣的:

public class ViewModel 
{ 
    public ObservableCollection<Codes> Codes { get; } 
     = new ObservableCollection<Codes>(); 
} 

的主窗口構造函數:

public MainWindow() 
{ 
    InitializeComponent(); 

    var viewModel = new ViewModel(); 
    viewModel.Codes.Add(new Codes { CodeID = "1", Code = "CODETEXT" }); 

    DataContext = viewModel; 
} 

的XAML:

<ComboBox ItemsSource="{Binding Codes}" DisplayMemberPath="Code" .../> 
+0

多數民衆贊成在輝煌,工作的一種享受,何處XAML綁定進入這個,因爲我認爲這是MVVM的方式來做事情?如果我分配steamCode.ItemsSource =代碼;在代碼中,那麼沒有必要綁定?非常感謝您的回答! –

+0

是的,你不需要在你的XAML中設置ItemsSource,因爲你已經在你的代碼中做了它,這是做這件事的一種方法。看看這篇文章,以更好地瞭解WPF中的DataBinding是如何工作的:http://www.codeproject.com/Articles/29054/WPF-Data-Binding-Part – Alex

+0

本教程也是一個很好的開始:http ://www.wpf-tutorial.com/data-binding/introduction – Alex