1

我正在创建一个应用程序来显示未运行的 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()函数)会被刷新。

到目前为止一切都很好。我只需要在 Listview 中显示停止的进程,我认为这可以使用 XAML 中的样式或触发器来完成吗?如果是,如何?

谢谢你的时间。

4

3 回答 3

1

我认为您应该使用ListCollectioView,并使用Filter属性对其进行过滤。首先,您必须加载所有服务,然后您可以使用Timer.Elapsed事件每 N 秒更新一次。

于 2012-11-15T08:38:47.893 回答
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 的可见性和高度

于 2012-11-15T10:04:07.033 回答
0

只需从ObservableCollection<NotifiableServiceController>您绑定的对象中删除正在运行的服务,ListView并在服务停止时将其添加回来。如果您想保留所有服务的集合,请为此创建一个额外的集合。

于 2012-11-15T08:37:34.993 回答