我正在创建一个应用程序来显示未运行的Windows服务列表。问题是这些服务应该反映发生的任何变化,即如果服务启动,应该从显示的列表中删除该服务。
我使用了ListView,这里是代码:
<Window.Resources>
<ObjectDataProvider ObjectType="{x:Type local:NotifiableServiceController}"
MethodName="GetServices" x:Key="ManageServices">
</ObjectDataProvider>
</Window.Resources>
<Grid>
<ListView Name="lstViewServices" Width="Auto" ItemsSource="{Binding Source={StaticResource ManageServices}}"
SelectionMode="Single">
<ListView.View>
<GridView>
<GridViewColumn Header="SoftOne Services" DisplayMemberBinding="{Binding Path=DisplayName}" />
<GridViewColumn Header="Status">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Status}">
</TextBlock>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
</Grid>
和获取服务列表的函数:
public static ObservableCollection<NotifiableServiceController> GetServices()
{
ObservableCollection<NotifiableServiceController> oaServices = new ObservableCollection<NotifiableServiceController>();
//Retrieving the services starting with "SQL"
foreach (ServiceController sc in ServiceController.GetServices().Where(p => p.DisplayName.StartsWith("SQL")))
{
oaServices.Add(new NotifiableServiceController(sc));
}
return oaServices;
}
正在按时间间隔更新NotifiableServiceController
以刷新关联的Windows服务的状态。但只会刷新首次检索到的服务(来自GetServices()
函数)。
感谢您的时间。
答案 0 :(得分:1)
我认为您应该使用 ListCollectioView ,并使用过滤器属性对其进行过滤。首先,您必须加载所有服务,然后使用 Timer.Elapsed 事件每隔N秒更新一次。
答案 1 :(得分:1)
解决方案是向ListView添加一个样式并将ListViewItem作为目标:
<ListView.Resources>
<Style TargetType="ListViewItem">
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="Running">
<Setter Property="ListBoxItem.Visibility" Value="Hidden" />
<Setter Property="Height" Value="0" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.Resources>
根据服务Status
,我可以设置可见性和ListViewItem的高度
答案 2 :(得分:0)
只需从绑定ObservableCollection<NotifiableServiceController>
的{{1}}中删除正在运行的服务,并在服务停止时将其添加回来。如果您想保留所有服务的集合,请为此创建一个额外的集合。