背景:
我正在制作一个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对象的属性,所以我想写一篇新文章。