c# - 如何根据对象的出现改变边框的样式?
问题描述
我创建了一个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
.
解决方案
您可以通过给目标Border
命名为 likeTableNameBorder
并将触发器添加到将Style
边框的设置为closeBorderTableStyle
when isTableOpen
is的模板来做到这一点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>
.
推荐阅读
- c# - C# loop parallel for
- jquery - Jquery Selectable 设置选中的类
- java - if 块如何删除重复字符?
- swift - 如何正确添加一行到 NSTableView
- python - 通过 ts3 api 发送 sendtextmessage
- html - 如何将固定元素放入转换后的容器中?
- c - C 凯撒密码函数调用未按预期运行
- here-olp - com.here.schema.geometry.v2.geometry.Geometry 到 WKT,由 Java
- reactjs - 如何在 React JS 中使用点符号初始化变量名?
- postgresql - 使用 Pentaho DI 增量上传/更新到 PostgreSQL 表