点击Caliburn中的按钮.Micro将项目添加到组合框中

本文关键字:添加 组合 项目 Micro Caliburn 按钮 点击 | 更新日期: 2023-09-27 18:23:49

我刚开始用C#用MahApps.Metro和Caliburn.Micro编写我的简单应用程序,我遇到了一个问题。我对MVVM模型不是很熟悉,所以我正在努力理解它。我试图做的是在点击按钮后用项目填充组合框(点击按钮搜索COM端口并将COM添加到组合框)。你能告诉我怎么做吗?这是我的MainView.xaml:的一部分

<WrapPanel Orientation="Horizontal">
                    <WrapPanel Orientation="Vertical">
                        <Label Name="SelectCOM" Content="{x:Static r:Translations.SelectCOM}" FontWeight="Bold" FontSize="12" />
                        <ComboBox Width="235" 
                                  x:Name="COMPorts" 
                                  SelectedItem="{Binding SelectedPort}" />
                    </WrapPanel>
                    <Button Margin="10,0,0,0" 
                            Width="70" 
                            Content="{x:Static r:Translations.Refresh}" 
                            HorizontalAlignment="Right" 
                            cal:Message.Attach="RefreshCOM" />
                </WrapPanel>

这是我的MainViewModel:

public class MainViewModel : PropertyChangedBase
    {
        IDevice Device = null;
        private string selectedPort;
        public void RefreshCOM()
        {
            string[] ports = SerialPort.GetPortNames();

        }
        public string SelectedPort
        {
            get
            {
                return this.selectedPort;
            }
            set
            {
                this.selectedPort = value;
                this.NotifyOfPropertyChange(() => this.SelectedPort);
            }
        }
    }

点击Caliburn中的按钮.Micro将项目添加到组合框中

您需要将COM端口列表"绑定"到控件的ItemsSource。

<ComboBox Width="235" 
          x:Name="COMPorts" 
          SelectedItem="{Binding SelectedPort}"
          ItemsSource="{Binding ComPorts}" />

别忘了更新你的视图模型(添加一个可观察的com端口名称集合)

public class MainViewModel : PropertyChangedBase
{
    // ...
    public MainViewModel() 
    {
      ComPorts = new ObservableCollection<string>();
    }
    public void RefreshCOM()
    {
        string[] ports = SerialPort.GetPortNames();
        foreach(var port in ports)
        {
           ComPorts.Add(port);
        }
    }
    public ObservableCollection<string> ComPorts {get; private set;}
    // ...
}