도움이 될 수 있습니다 아마도 바인딩. 그래도 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를가 (이전의 답변에 따라)가 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>
동적 어떤 이유로 로그 항목의 텍스트를 변경하려면, 목록보기를 업데이트하려면 LogEntry 클래스에 INotifyPropertyChanged
인터페이스를 구현해야합니다.
나는 더 이상 적합한 것이 나타나지 않으면 대답 해 주겠다. WPF에 익숙하지 않아 이것이 가장 좋은 해결책인지 확인할 수 없습니다. – carlsb3rg
소스 및 메시지를 표 형식으로 표시하려면 (그리고 각각의 새 메시지는 새 항목으로 간주됩니다) 아마도 이것은 가장 간단한 방법입니다. 그러나 '꼬리'처럼 작동하고 최신 메시지 (예 : 10 개) 만 유지하려는 경우 다음 중 하나를 수행하십시오. A. 위의 솔루션에서 항목을 섞어 야합니다 (좋지 않거나 B. 대안을 찾아야 할 필요가 있습니다. – publicgk
좋아요, 제가 제시 한 방식으로 문제에 대한 좋은 해결책이 되었기 때문에 대답을 드리겠습니다. 다른 문제로 인해 대안 B를 선택할 것입니다.) – carlsb3rg