Справочная информация:
Я создаю приложение 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, а не вручную редактирую свойства объектов пользовательского интерфейса, поэтому я решил сделать новое сообщение.