我有一个ListView
文件显示列表。添加到ListView
项目时,background
添加的元素应该是红色的,因为最初添加的文件具有MessageFileId == null
. 然后对于任何元素,我更改MessageFileId
为任何值。当 时MessageFileId != null
,您需要background
此元素变为绿色。这个怎么做?目前,所有元素都只有background
红色。
视图模型:
public class TicketAttachFiles
{
public string AttachFilePath { get; set; }
public int? MessageFileId { get; set; }
}
public ObservableCollection<TicketAttachFiles> AttachFiles { get; set; }
看法:
<ListView Grid.Row="2" Grid.Column="0" Background="Transparent"
ItemsSource="{Binding AttachFiles, UpdateSourceTrigger=PropertyChanged}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem" d:DataContext="{Binding AttachFiles, UpdateSourceTrigger=PropertyChanged}">
<Style.Triggers>
<DataTrigger Binding="{Binding TicketMessageFileId, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<fa:ImageAwesome Icon="PictureOutline" />
<TextBlock Grid.Row="1"
Text="{Binding Path=AttachFilePath}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
在我为某个元素设置字段的值后MessageFileId
,该元素不会失去其红色背景。
你应该记住一个简单的规则。
如果您从代码中更改绑定属性的值并希望在 View 层中跟踪此更改,则此属性必须调用
INotifyPropertyChanged
(INPC)!也就是说,您在某处创建一个将实现 INPC 的类。
最简单的例子:
接下来,您从先前创建的类继承您的 VM 类:
在所有必要的属性中,调用通知方法,执行如下操作:
在这一行
<DataTrigger Binding="{Binding TicketMessageFileId, UpdateSourceTrigger=PropertyChanged}" Value="{x:Null}">
中,您的错误是TicketMessageFileId
将在主 VM(您拥有的地方)中查找该属性AttachFiles
。对于胜任的工作,触发器应放置在DataTemplate
模板本身中。标记将是这样的:
结果: