C # WPF - отслеживать выбранные элементы флажка в выпадающем списке - PullRequest
0 голосов
/ 05 июня 2019

Справочная информация:

Я создаю приложение C # WPF, которое сканирует IP-адреса и адреса портов (например, 127.0.0.0:8080) различных служб, которые у меня есть, эта программа будет читать файл json, чтобы получить полный список адресов IP и портов , Первоначально я сделал простую программу со статическим интерфейсом, но мой босс хочет, чтобы интерфейс был более динамичным, поэтому я решил переключиться на 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 создаст новый поток и запустит процесс, чтобы основной поток пользовательского интерфейса не зависал.

Текущий ход мыслей:

Я думаю о сохранении отдельной наблюдаемой коллекции, которая будет редактироваться всякий раз, когда изменяется свойство IsChecked каждого комбинированного списка, эта наблюдаемая коллекция будет содержать только те службы, которые были выбраны в данный момент. Таким образом, я могу просто перебрать наблюдаемую коллекцию и вызывать методы checkservice при нажатии кнопки. Но я понятия не имею, как это сделать.

Любая помощь будет принята с благодарностью, и извините за длинный пост.

PS: я уже публиковал аналогичный вопрос ранее, но я переключаюсь на MVVM, а не вручную редактирую свойства объектов пользовательского интерфейса, поэтому я решил сделать новое сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...