【问题标题】:refresh combobox items at runtime wpf在运行时刷新组合框项目 wpf
【发布时间】:2013-11-19 07:49:27
【问题描述】:

我想要一个包含开放串行端口作为项目的组合框。但是当串口修改时它会自动更新。

我的做法是这样的:

  1. 在 Xaml 中创建一个像这样的组合框:

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" ContextMenuOpening="comboBox1_ContextMenuOpening" />
    
  2. 创建一个循环槽端口并将它们添加到组合框的方法:

    public string[] portsManual;
    
    public void adaugaPorturi()
    {
        if (comboBox1.Items.Count > 0)
        {
            comboBox1.Items.RemoveAt(0);
        }
        comboBox1.Items.Add("Select port");
        comboBox1.SelectedItem = "Select port";
        portsManual = SerialPort.GetPortNames();
        foreach (string port in portsManual)
        {
            comboBox1.Items.Add(port);
        }
        comboBox1.Items.Refresh();
        Array.Clear(portsManual, 0, portsManual.Length);
    }
    
  3. 在 window.load 中调用此方法(因此它可以在其中包含一些内容 - 端口随即打开)并在 ContextMenuOpening 事件中调用它(每当我单击组合框以选择一个项目 - 一个端口时,进行刷新)

注意:我在开始时清除了组合框项目(如果有的话),对于字符串数组也是如此,但它不会更新,这些项目仍然是第一次运行此方法时的项目!

我尝试过:ObservableCollection、字符串和数组都没有运气。我在这个网站上找到的最多信息。我在想,因为只有几个端口,我真的不需要集合或列表。我只是直接添加项目。

顺便说一句,管理员可以编辑这篇文章吗?我不确定文本格式是否好。

【问题讨论】:

    标签: wpf combobox


    【解决方案1】:

    首先,您可能应该使用 MVVM 和数据绑定,而不是直接从视图的代码隐藏中查询串行端口。

    其次,您似乎使用了错误的事件,如果您希望每次菜单打开时都刷新,您应该使用 DropDownOpened 事件

    <ComboBox Height="23" HorizontalAlignment="Left" Margin="87,35,0,0" Name="comboBox1" VerticalAlignment="Top" Width="147" DropDownOpened="comboBox1_DropDownOpened" />
    

    然后在你的代码隐藏中试试这个

    public void InitPorts()
    {
        RefreshPorts();
        comboBox1.SelectedItem = "Select port";
    }
    public void RefreshPorts()
    {
        comboBox1.Items.Clear();
        comboBox1.Items.Add("Select port");
        foreach (var port in SerialPort.GetPortNames())
            comboBox1.Items.Add(port);
    }
    private void MainWindow_OnLoaded(object sender, RoutedEventArgs e)
    {
        InitPorts();
    }
    private void ComboBox1_OnDropDownOpened(object sender, EventArgs e)
    {
        RefreshPorts();
    }
    

    【讨论】:

    • Ty,它有效!谢谢!似乎我一直在使用错误的事件,并且我一直在尝试使用列表和集合进行大量实现,但仍然没有工作。非常感谢。
    猜你喜欢
    • 2013-03-24
    • 2020-05-19
    • 2010-11-29
    • 1970-01-01
    • 2021-10-04
    • 2011-07-19
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    相关资源
    最近更新 更多