首页 > 解决方案 > 如何根据对象的出现改变边框的样式?

问题描述

我创建了一个ListView. 在此列表视图中,每个矩形代表企业中的表格。这些表可以有收据。{StaticReseource closeTableBorderStyle}我为没有收据的桌子制作了样式。但是如果表格有添加,我想改变表格的样式。

closeTableBorderStyle代码:

<Style x:Key="closeTableBorderStyle" TargetType="Border">
        <Setter Property="Height" Value="100"/>
        <Setter Property="Background" Value="#0a7d38"/>
        <Setter Property="CornerRadius" Value="8"/>
        <Setter Property="Margin" Value="5,5,0,0"/>
        <Setter Property="Cursor" Value="Hand"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="#00d052"/>
            </Trigger>
        </Style.Triggers>
    </Style>

表类:

public class Table
    {
        public int tableID { get; set; }
        public string tablename { get; set; }
        public List<OrderReceipt> tableReceipt { get; set; }
    }

列表显示:

          x:Name="ListViewTableBorder"
          SelectionChanged="ListViewTableBorder_SelectionChanged" 
          HorizontalContentAlignment="Stretch" 
          VerticalContentAlignment="Stretch">
   <ListView.ItemsPanel>
      <ItemsPanelTemplate>
         <UniformGrid Columns="5"/>
      </ItemsPanelTemplate>
   </ListView.ItemsPanel>
   <ListView.ItemContainerStyle>
      <Style TargetType="{x:Type ListViewItem}">
         <Setter Property="Background" Value="Transparent" />
         <Setter Property="BorderBrush" Value="Transparent"/>
         <Setter Property="VerticalContentAlignment" Value="Center"/>
         <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type ListViewItem}">
                  <Grid Background="{TemplateBinding Background}">
                     <Border Name="Selection" Visibility="Collapsed" />
                     <Border Style="{StaticResource sales_border}">
                        <TextBlock Text="{Binding tablename}" 
                                   HorizontalAlignment="Center" 
                                   VerticalAlignment="Center"
                                   Foreground="White"
                                   FontSize="20"/>
                     </Border>
                     <GridViewRowPresenter Grid.RowSpan="2"
                                           Margin="{TemplateBinding Padding}"
                                           HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                  </Grid>
               </ControlTemplate>
            </Setter.Value>
         </Setter>
      </Style>
   </ListView.ItemContainerStyle>
</ListView>

它来到Table类来定义一个名为的布尔变量isTableOpen,然后编写一个如下所示的算法,但我做不到。

if isTableOpen = false
{
   style -> closeTableBorder
}
else
{
   stlye -> openTableBorder
}

总之,如果tableReceipt.Count> 0,我希望边框样式为openBorderTableStyle. 否则tableReceipt.Count< 0,我希望边框样式为closeBorderTableStyle.

标签: c#wpfxaml

解决方案


您可以通过给目标Border命名为 likeTableNameBorder并将触发器添加到将Style边框的设置为closeBorderTableStylewhen isTableOpenis的模板来做到这一点false

<ControlTemplate TargetType="{x:Type ListViewItem}">
   <Grid Background="{TemplateBinding Background}">
      <Border Name="Selection" Visibility="Collapsed" />
      <Border x:Name="TableNameBorder" Style="{StaticResource sales_border}">
         <TextBlock Text="{Binding tablename}" 
                    HorizontalAlignment="Center" 
                    VerticalAlignment="Center"
                    Foreground="White"
                    FontSize="20"/>
      </Border>
      <GridViewRowPresenter Grid.RowSpan="2"
                            Margin="{TemplateBinding Padding}"
                            HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
   </Grid>
   <ControlTemplate.Triggers>
      <DataTrigger Binding="{Binding isTableOpen}" Value="False">
         <Setter TargetName="TableNameBorder" Property="Style" Value="{StaticResource closeTableBorderStyle}"/>
      </DataTrigger>
   </ControlTemplate.Triggers>
</ControlTemplate>

如果您打算更改属性,请考虑INotifyPropertyChanged在您的Table类型中实现,否则更改将不会反映在用户界面中。同样,如果你想在运行时修改你的集合,你应该使用ObservableCollection<T>而不是List<T>.


推荐阅读