C#WPF-将属性存储在字典中并作为参数传递给函数

时间:2019-06-01 02:10:30

标签: c# wpf data-binding

我正在制作一个端口扫描程序C#WPF程序,该程序可以扫描我拥有的所有不同服务中的各种IP和端口,并且还将使用Material Design in XAML来获得外观更好的UI。

我的计划是将IP和端口的列表分解成我拥有的各种服务,每个服务一个线程来运行检查。这意味着我将有一个字典对象来处理此问题,一项服务的结果将链接到一些UI组件。

get_text是执行端口扫描的功能,我决定使用数据绑定来更新我的UI。但经过一些研究,似乎:

  1. 我无法将属性作为out引用传递给函数
  2. 我无法将属性作为键的值存储在字典中

我试图寻找实现自己想要的方法,而我唯一能想到的就是在我的get_text函数中使用一个switch case语句,因为我有将近20个服务,所以这很麻烦。

下面显示的是我的代码:

namespace PortScanner
{
    public partial class MainWindow : Window , INotifyPropertyChanged
    {

        public MainWindow()
        {
            InitializeComponent();
            tb_portstatus.Text = "Click the button to query ports";
            dns_info.Text = tb_portstatus.Text;
            DataContext = this;
        }

        private string _Hello = "Select Workflow Variant:";
        public string Hello
        {
            get { return _Hello; }
            set
            {
                _Hello = value;
                OnPropertyChanged();
            }
        }

        private string _Hello2 = "Select Workflow Variant:";
        public string Hello2
        {
            get { return _Hello2; }
            set
            {
                _Hello2 = value;
                OnPropertyChanged();
            }
        }



        public void get_text(string ip , string port, string uiref)
        {
            string command = $"-n {ip} -o {port}";
            Process proc = new Process();
            proc.StartInfo.FileName = "PortQry.exe";
            proc.StartInfo.Arguments = command;
            proc.StartInfo.CreateNoWindow = true;
            proc.StartInfo.UseShellExecute = false;
            proc.StartInfo.RedirectStandardOutput = true;
            proc.Start();
            string query_output = proc.StandardOutput.ReadToEnd();
            proc.WaitForExit();

            switch (uiref)
            {
                case "Option 1":
                    Hello = "Something else";
                    break;
                case "Option 2":
                    Hello2 = "Something else";
                    break;
            }



        }



        private void Btn1_Click(object sender, RoutedEventArgs e)
        {
            Thread query_status = new Thread(() => get_text("127.0.0.0", "8080","Option 1"));
            query_status.Start();
        }

        public event PropertyChangedEventHandler PropertyChanged;
        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

对此将提供任何帮助!

注意:该问题链接到this one。但是我决定改用数据绑定方法,并提供更多上下文,因此我觉得对此提出一个新问题会更合适。

0 个答案:

没有答案