C#WPF-跟踪组合框中的所选复选框项目

时间:2019-06-05 02:18:28

标签: c# wpf

背景:

我正在制作一个C#WPF应用程序,该应用程序扫描我拥有的各种服务的IP和端口地址(例如127.0.0.0:8080),该程序将读取json文件以获取IP和端口地址的完整列表。最初,我使用静态UI编写了一个简单程序,但老板希望UI更具动态性,因此我决定切换到MVVM。我仍然是MVVM的初学者。 这是我当前的代码: MainWindow.xaml:

   <Grid>
        <ComboBox Name="selectionpanel" Margin="54,117,498.333,265.667" Height="38" IsReadOnly="True">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding servicename}" IsChecked="False" />
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
        <ListBox Name="selectiondisplay" Margin="409,117,209.333,72.667">
            <ListBox.ItemContainerStyle>
                <Style TargetType="ListBoxItem">
                    <Setter Property="IsEnabled" Value="False" />
                </Style>
            </ListBox.ItemContainerStyle>
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <materialDesign:Chip FontWeight="Bold" FontStyle="Italic"/>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
    </Grid>

MainWindow.xaml.cs:

namespace App
{
    public partial class MainWindow : Window , INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        // This section is for declaration of global variables

        Dictionary<string, Dictionary<string, List<string>>> conf_dict;
        public ObservableCollection<serviceobject> service_object_list = new ObservableCollection<serviceobject>();



        public MainWindow()
        {
            InitializeComponent();
            load_config("InitData/data.json");
            selectionpanel.ItemsSource = service_object_list;          
        }

        private void load_config(string filepath)
        {
            // Read json config file
            var config = File.ReadAllText(filepath);
            this.conf_dict = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, List<string>>>>(config);
            // create objects for each service and append to list
            foreach(var service in this.conf_dict.Keys)
            {
                service_object_list.Add(new serviceobject (this.conf_dict[service]){ servicename = service });
            }
        }


        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }


    }
}

Serviceobject.cs:

namespace App
{
    public class serviceobject : INotifyPropertyChanged
    {

        public event PropertyChangedEventHandler PropertyChanged;

        public string servicename { get; set; }

        Dictionary<string, List<string>> ipandportlist;

        public serviceobject(Dictionary<string, List<string>> ipandports)
        {
            this.ipandportlist = ipandports;
        }

        private void checkservice()
        {
            // Create new thread and do stuff
        }

        private void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }


    }
}

注释:

我不允许发布配置文件,只是假设this.conf_dict.Keys基本上包含所有服务名称(例如“ Service1”,“ Service2”)。 组合框selectionpanel绑定到service_object_list可观察的集合。我希望能够在selectiondisplay列表框中主动跟踪用户选择了哪些服务,并向用户显示当前选择。  最终,我希望能够单击一个按钮,并在每个所选服务上调用checkservice方法,以检查那些服务的ip和端口地址,并可能更新一些数据模板。 Checkservice将创建一个新线程并运行该进程,以便主UI线程不会冻结。

当前思路:

我正在考虑维护一个单独的可观察集合,只要每个组合框的IsChecked属性发生更改,该可观察集合都将被编辑,该可观察集合将仅包含当前选定的服务。这样,我可以遍历可观察的集合并在单击按钮时调用checkservice方法。但是我不知道该怎么做。

任何帮助将不胜感激,对于冗长的帖子深表歉意。

PS:我之前发布过a similar question,但是我切换到MVVM,而不是手动编辑UI对象的属性,所以我想写一篇新文章。

0 个答案:

没有答案