WPF:隐藏使用GridviewColumn定义的Listview项

时间:2012-11-15 08:10:56

标签: c# wpf xaml

我正在创建一个应用程序来显示未运行的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中的Style或Triggers来完成?如果有,怎么样?

感谢您的时间。

3 个答案:

答案 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}}中删除正在运行的服务,并在服务停止时将其添加回来。如果您想保留所有服务的集合,请为此创建一个额外的集合。