Why
- 以前是个菜鸡(虽然现在也是),还记得之前问如果
ChatGPT,如果我有个listbox显示日志,我需要将不同的日志类型显示不同的前景色应该怎么做,它当时说让我自定义控件,无法做到,我当时也没多想就觉得不好做,现在早上突然一下子醒悟过来了应该怎么做,可能还是WPF的基础不够扎实,走了很多弯路。
How
public partial class MainViewModel : ObservableObject
{
public MainViewModel()
{
var random = new Random();
for (int i = 0; i < 100; i++)
{
var log = new LogInfo()
{
LogMessage = $"Log message {i}",
LogType = (LogType)(random.Next(4))
};
_logInfos.Add(log);
}
}
[ObservableProperty]
private ObservableCollection<LogInfo> _logInfos = [];
}
public partial class LogInfo : ObservableObject
{
public LogInfo()
{
}
[ObservableProperty]
private string _logMessage;
[ObservableProperty]
private LogType _logType = LogType.Debug;
}
public enum LogType
{
Debug,
Info,
Warning,
Error,
}
<ListBox Grid.Row="1" ItemsSource="{Binding LogInfos, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<TextBlock Text="{Binding LogMessage}" />
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding LogType}" Value="{x:Static local:LogType.Debug}">
<Setter Property="Foreground" Value="Green" />
</DataTrigger>
<DataTrigger Binding="{Binding LogType}" Value="{x:Static local:LogType.Warning}">
<Setter Property="Foreground" Value="LightPink" />
</DataTrigger>
<DataTrigger Binding="{Binding LogType}" Value="{x:Static local:LogType.Info}">
<Setter Property="Foreground" Value="Yellow" />
</DataTrigger>
<DataTrigger Binding="{Binding LogType}" Value="{x:Static local:LogType.Error}">
<Setter Property="Foreground" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
- 效果截图

Tips
- 最近打算重新学一下
WPF基础了,很多时候基础还是最重要的,不然也不至于这么简单的现在才反应过来。