2012-02-21 40 views
2

我已經使用的方法,串[]計數被傳遞到組合框,但字符串[]值不是

public static string[] getMyStrings() 

並將其傳遞給像的組合框:

cmbMyBox.itemsSource = getMyStrings(). //(more detail below) 

調試器顯示字符串已被添加到組合框,但是當我查看組合框時,條目的數量在那裏,但空白。任何人都知道我在做什麼錯了?

我的設備列表:

public static string[] GetMIDIInDevices() 
    { 
     //get list of devices 
     string[] returnDevices = new string[MidiIn.NumberOfDevices]; 

     // Get the product name for each device found 
     for (int device = 0; device < MidiIn.NumberOfDevices; device++) 
     { 
      returnDevices[device] = MidiIn.DeviceInfo(device).ProductName; 
     } 
     return returnDevices; 
    } 

簡單的代碼在WPF我的主窗口上顯示:

public MainWindow() 
    { 
     InitializeComponent(); 
     cmbMidiDropdown.ItemsSource = NAudioMIDI.GetMIDIInDevices(); 
     //LoadMidiInDevicesIntoComboBox(); 
    } 

這裏的XAML:

<TabItem Header="MIDI Settings" Name="tabMidiSettings" Background="DarkGoldenrod"> 
      <Grid Background="Honeydew"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="10" /> 
        <ColumnDefinition Width="758" /> 
       </Grid.ColumnDefinitions> 
       <ComboBox Grid.Column="1" Height="23" HorizontalAlignment="Right" Margin="0,141,146,0" Name="cmbMidiDropdown" VerticalAlignment="Top" Width="312" ItemsSource="{Binding}" DisplayMemberPath="Name" /> 
       <Label Content="Select Midi Input device" Grid.Column="1" Height="28" HorizontalAlignment="Left" Margin="143,141,0,0" Name="label1" VerticalAlignment="Top" /> 
      </Grid> 
     </TabItem> 

調試器輸出:

GetMIDIInDevices()

-  returnDevices {string[3]} string[] 
    [0] "MIDISPORT 2x2 In A" string 
    [1] "MIDISPORT 2x2 In B" string 
    [2] "Turtle Beach USB MIDI 1x1" string 
    returnDevices[device] "Turtle Beach USB MIDI 1x1" string 

cmbMIDIDropdown

​​
+0

請顯示幾個實際的字符串值,可能有一些特殊符號 – sll 2012-02-21 16:54:44

+0

我的猜測是你有你的XAML綁定是不正確的。你可以發佈你的XAML嗎? – 2012-02-21 16:55:08

+0

看起來很好,因爲設備的'ProductName'實際上包含任何內容,所以您可能需要檢查它。如上所述,您的XAML可能也是錯誤的。 – 2012-02-21 16:59:49

回答

1

您正在設置XAML中的ItemsSource,以及DisplayMemberPath。當您在代碼中設置ItemsSource時,您不會更改DisplayMemberPath,因此組合框正嘗試調用每個對象的.Name屬性。 String沒有.Name,所以你得到空白。從你的xaml中刪除ItemsSourceDisplayMemberPath,你應該看到你期望的值。

+0

這工作! 看來我忘了清理我的一些數據綁定實驗。謝謝您的幫助。這有點棘手。感謝大家的幫助! – Laserbeak43 2012-02-21 17:16:07

0

嘗試......

cmbMidiDropdown.DataContext = NAudioMIDI.GetMIDIInDevices(); 

通過在ItemsSource屬性上設置{Binding},可以將ItemsSource設置爲繼承DataContext。在這樣做時,只需將ComboBoxDataContext設置爲字符串列表,將允許ComboxBox相應地填充。

此外,不需要設置DisplayMemberPath,因爲您將ItemsSource設置爲字符串與複雜對象的列表,並且Name屬性在字符串類中不存在。

+0

它似乎沒有區別。伯爵仍然在那裏,但沒有文字。 – Laserbeak43 2012-02-21 17:12:28

+0

如果您調用'cmbMidiDropdown.DataContext = NAudioMIDI.GetMIDIInDevices();'而不是'cmbMidiDropdown.ItemsSource = NAudioMIDI。GetMIDIInDevices();'在你的代碼後面並移除你的'DisplayMemberPath'引用,但是保留你的'ItemsSource = {Binding}'它將會工作。 – 2012-02-21 17:18:55

+0

啊好的,所以根據給出的兩個答案來判斷,看起來DisplayMemberPath和ItemsSource = {Binding}以某種方式相互衝突(在這個特定的情況下,至少)? – Laserbeak43 2012-02-21 17:22:28