2013-08-18 104 views
2

我有一个ItemsControl,用于显示从计时系统发送的启动信息列表。在条件控件上显示/隐藏条目

如果车道编号没有显示(如果它为空或空白),我需要能够“关闭”/停止显示一组车道信息,然后如果计时器发送信息切换车道返回然后再显示数据。

我不能将它设置为只删除所有东西,因为定时器不断发送它的信息,除了通道号之外的所有东西都会再次出现。

是否可以在条件上显示/隐藏项目?

什么正在发生的事情

Lanes 
1 ------ 
2 ------ 
    ------ <- other info remains 
4 ------ 

我希望发生

Lanes 
1 ------ 
2 ------ 

4 ------ 

这里什么是我的ItemsControl代码样本

<ItemsControl ItemsSource="{Binding CHeat.SwimList}" Margin="10,0" HorizontalAlignment="Left" VerticalAlignment="Top"> 
      <ItemsControl.Template> 
       <ControlTemplate TargetType="ItemsControl"> 
        <StackPanel> 
         <StackPanel Orientation="Horizontal"> 
          <Label Content="Lane" /> 
          <Label Content="Pos" /> 
          <Label Content="Swimmer" /> 
          <Label Content="Club" /> 
          <Label Content="Time" /> 
         </StackPanel> 
         <ItemsPresenter/> 
        </StackPanel> 
       </ControlTemplate> 
      </ItemsControl.Template> 

      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel/> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 

      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="35" /> 
           <ColumnDefinition Width="30" /> 
           <ColumnDefinition Width="150" /> 
           <ColumnDefinition Width="50" /> 
           <ColumnDefinition Width="80" /> 
          </Grid.ColumnDefinitions> 
          <Label Grid.Column="0" Content="{Binding LaneNumber}" /> 
          <Label Grid.Column="1" Content="{Binding Position}" /> 
          <Label Grid.Column="2" Content="{Binding Swimmer}" /> 
          <Label Grid.Column="3" Content="{Binding Club}" /> 
          <Label Grid.Column="4" Content="{Binding Time}" /> 
         </Grid> 
        </StackPanel> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 

如果有一种方法,我可以设置Content = ""为基于LaneNumber的其他数据,然后我相信它可以工作,因为那么我可以重新绑定绑定。

我对WPF相当陌生,所以额外的细节将有助于非常感谢!

+1

'是否可以显示/隐藏条件?' - >是的,它被称为'触发器'有多种类型。对于你的情况,你可以使用'DataTrigger'来检查Lane号是否为空/空,如果是这样,则将该项的'Visibility'设置为'Hidden'。只需google即可查看“DataTrigger”的示例。另外如果你是WPF的新手,'Label'在WPF中有特定的用途。它不仅仅显示“文本”,而且只是在显示文本之后使用“TextBlock”。还要检查一些WPF布局的例子。你在做什么不是“错误”,但可以做得更好。 – Viv

+0

@Viv谢谢,我会看看我能想出什么应该工作。您认为我可以通过哪种方式改善布局?这是一个在制品,所以目前看起来有点整齐,但我更关心它的功能。 – pgwri

+0

不客气。至于布局,像'DataTemplate'中说的那样,为什么当它是唯一的孩子时,将'Grid'嵌套在'StackPanel'内。除了**必要之外,WPF中的固定宽度也是**。在你的情况下,你的列大小是固定的,因此它不可扩展。您可以使用基于“*”的乘法器来根据可用的百分比为网格控件分配空间。如果你只需要固定尺寸,你也可以在物品上指定宽度并去掉'Grid'。你不会在一天之内完成所有工作,如果你试着足够好。只是继续提炼。 – Viv

回答

1

为什么不尝试使用Visibility属性? 您只需在您的MVVM或代码后面创建一个公共属性,并将其绑定到您要隐藏的元素。

<StackPanel Visibility="{Binding ShowElement, Converter={StaticResource VisibilityConverter}, Mode=TwoWay}"> 

通过设置ShowElement的布尔值,您可以轻松地隐藏或显示StackPanel。