【问题标题】:string[] count is passed to ComboBox, but string[] value is notstring[] 计数被传递给 ComboBox,但 string[] 值不是
【发布时间】:2012-02-21 16:52:12
【问题描述】:

我用过一个方法,

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

+       cmbMidiDropdown {System.Windows.Controls.ComboBox Items.Count:3}        
-       cmbMidiDropdown.ItemsSource {string[3]}      
-       [string[]]  {string[3]} string[]
    [0] "MIDISPORT 2x2 In A"    string
    [1] "MIDISPORT 2x2 In B"    string
    [2] "Turtle Beach USB MIDI 1x1" string

【问题讨论】:

  • 请显示一些实际的字符串值,也许有一些特殊符号
  • 我的猜测是您的 XAML 中的绑定不正确。您也可以发布您的 XAML 吗?
  • 看起来不错,因为设备的ProductName 实际上包含任何内容,您可能需要检查一下。如前所述,您的 XAML 也可能是错误的。

标签: c# wpf naudio


【解决方案1】:

您正在 XAML 中设置 ItemsSource,以及 DisplayMemberPath。在代码中设置 ItemsSource 时,不会更改 DisplayMemberPath,因此组合框会尝试调用每个对象的 .Name 属性。 String 没有.Name,所以你得到了空白。从您的 xaml 中删除 ItemsSourceDisplayMemberPath,您应该会看到您期望的值。

【讨论】:

  • 成功了!!看来我忘记清理我的一些数据绑定实验了。谢谢您的帮助。那有点棘手。感谢大家的帮助!
【解决方案2】:

试试这个...

cmbMidiDropdown.DataContext = NAudioMIDI.GetMIDIInDevices();

您通过在ItemsSource 属性上设置{Binding},将ItemsSource 设置为继承DataContext。为此,只需将 ComboBoxDataContext 设置为字符串列表,即可相应地填充 ComboxBox

此外,不需要设置 DisplayMemberPath,因为您将 ItemsSource 设置为字符串与复杂对象的列表,并且字符串类中不存在 Name 属性。

【讨论】:

  • 这似乎没有什么不同。计数仍然存在,但没有文字。
  • 如果您在后面的代码中调用 cmbMidiDropdown.DataContext = NAudioMIDI.GetMIDIInDevices(); 而不是 cmbMidiDropdown.ItemsSource = NAudioMIDI.GetMIDIInDevices(); 并删除您的 DisplayMemberPath 引用但保留您的 ItemsSource = {Binding} 它将起作用。
  • 啊好的,所以从给出的两个答案来看,DisplayMemberPath 和 ItemsSource = {Binding} 似乎在某些方面相互冲突(至少在这个特定情况下)?
  • 它们本身并不冲突。那是您绑定到集合是一个字符串列表,并且它们在该类上没有 Name 属性。如果您创建了一个简单的Widget 类,该类具有Name 属性,并且您的集合包含Widgets;您可以将所有内容保留在 XAML 中,只需按照答案中的说明设置 DataContext 即可。
猜你喜欢
  • 2015-11-20
  • 2012-12-02
  • 2015-07-02
  • 2021-01-20
  • 1970-01-01
  • 2017-06-18
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多