WPF:更改后设置日志级别和刷新集合

时间:2018-03-28 12:50:01

标签: wpf collections

所以我的表单显示我的Application Log

这是我的Log型号:

public class LogEntry : IComparable<LogEntry>
{
    public string DateTime { get; set; }
    public int Index { get; set; }
    public string Source { get; set; }
    public Level Level { get; set; }
    public string Message { get; set; }

    public int CompareTo(LogEntry other)
    {
        return DateTime.CompareTo(other.DateTime);
    }
}

public enum Level
{
    All = 0,
    Debug,
    Info,
    Warn,
    Error,
    Fatal,
    Off
}

日志助手

这是我的LogHelper类,根据用户选择的级别添加当前LogEvent

public static class LogHelper
{
    public static ObservableCollection<LogEntry> LogEntries { get; set; }
    public static bool AddLogToList { get; set; }
    private static int _level;
    private static int _index;
    private static string _formatPattern = "yyyy-MM-dd HH:mm:ss,fff";

    public static void SetLevel(Level level)
    {
        _level = (int)level;
    }

    public static void AddLog(Level level, string message, string className, string methodName)
    {
        if (LogEntries == null)
            LogEntries = new ObservableCollection<LogEntry>();

        if (AddLogToList)
        {
            int levelValue = (int)level;
            if (levelValue >= _level)
            {
                Application.Current.Dispatcher.Invoke(new Action(() =>
                {
                    if (LogEntries.Count == 1000)
                        LogEntries.RemoveAt(LogEntries.Count - 1);

                    LogEntry logEntry = new LogEntry()
                    {
                        DateTime = DateTime.Now.ToString(_formatPattern),
                        Index = _index++,
                        Level = level,
                        Source = className + "\\" + methodName,
                        Message = message.Trim()
                    };

                    LogEntries.Insert(0, logEntry);
                }));
            }
        }
    }
}

所以我将LogEvent添加到包含ti 1000个条目的列表中。

现在我希望能够过滤并仅显示相关的LogEvent级别。

所以我添加了ComboBox所有LogEvent级别并订阅了SelectionChanged个活动:

private void cbLogLevel_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    int index = cbLogLevel.SelectedIndex;
    LogHelper.SetLevel((Level)index);
    lvLogger.ItemsSource = LogHelper.LogEntries.Where(m => m.Level == (Level)index).ToList();
}

因此,在此SelectionChanged事件之后,我可以看到相关的LogEvent级别,但我唯一的问题是新的LogEvent未显示。

也许我需要对我的收藏或其他东西进行更新?

1 个答案:

答案 0 :(得分:1)

您正在创建新的List<LogEntry>并在事件处理程序中将ItemsSource属性设置为此属性。这意味着lvLogger将不再与ObservableCollection相关联。

您可以过滤视图,而不是重置ItemsSource

private void cbLogLevel_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
    int index = cbLogLevel.SelectedIndex;
    Level level = (Level)index;

    LogHelper.SetLevel(level);

    var collectionView = CollectionViewSource.GetDefaultView(lvLogger.ItemsSource);
    collectionView.Filter = x =>
    {
        LogEntry logEntry = x as LogEntry;
        return logEntry != null && logEntry.Level == level;
    };
}