Возможно, Binding может помочь. (Это может усложнить ситуацию, если вы все еще изучаете WPF.)
С помощью привязки мы можем сделать ListView
только видимым представлением вашей записи в журнале, то есть логика добавления / удаления журналов может быть отделена от ListView
полностью.
class LogEntry
{
public string Source { get; set; }
public string Message { get; set; }
public LogEntry(string source, string message)
{
Source = source;
Message = message;
}
}
class Listener
{
private int m_maxLogs = 10;
private ObservableCollection<LogEntry> m_logEntries;
public ObservableCollection<LogEntry> LogEntries { get { return m_logEntries; } }
public Listener()
{
m_logEntries = new ObservableCollection<LogEntry>();
}
public void AddLogEntry(string source, string message)
{
if (LogEntries.Count >= m_maxLogs)
{
//Remove the oldest LogEntry.
LogEntries.RemoveAt(0);
}
LogEntries.Add(new LogEntry(source, message));
}
}
Если для datacontext задан экземпляр Listener, xaml становится (на основании предыдущего ответа):
<ListView ItemsSource="{Binding LogEntries}">
<ListView.View>
<GridView>
<GridViewColumn Header="Source" Width="120" DisplayMemberBinding="{Binding Source}"/>
<GridViewColumn Header="Message" Width="400" DisplayMemberBinding="{Binding Message}"/>
</GridView>
</ListView.View>
</ListView>
Если по какой-то причине вы хотите динамически изменять текст записей журнала, вам потребуется реализовать интерфейс INotifyPropertyChanged
в классе LogEntry, чтобы обновить представление списка.