【发布时间】:2021-06-28 09:33:29
【问题描述】:
正如标题所述,我在将 ObservableCollection 绑定到 ItemsControl 时遇到问题。
MainWindow.xaml:
xmlns:ext="clr-namespace:DeConfigurator.Classes"
...
<ItemsControl ItemsSource="{Binding Source=ext:InAppSink.Logs}" Name="LogList">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander Header="{Binding Level}">
<TextBlock TextWrapping="Wrap">
<TextBlock.Text>
<Binding Path="FormattedEntry" />
</TextBlock.Text>
</TextBlock>
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
InAppSink:
namespace DeConfigurator.Classes
{
public class InAppSink : ILogEventSink
{
static readonly int MAX_ITEMS = 200;
static readonly int TO_REMOVE = 50;
public ObservableCollection<LogItem> Logs { get; set; } = new ObservableCollection<LogItem>();
public void Emit(LogEvent logEvent)
{
if (logEvent == null){throw new ArgumentNullException(nameof(logEvent)); }
if(Logs.Count > MAX_ITEMS)
{
for(int i = 0; i < TO_REMOVE; ++i)
{
Logs.RemoveAt(i);
}
}
Logs.Add(new LogItem(logEvent));
}
}
public class LogItem
{
readonly ITextFormatter _textFormatter =
new MessageTemplateTextFormatter(
"{Timestamp:yyyy-MM-dd HH:mm:ss zzz} [{Level}] [{Method}] {Message:lj}{NewLine}{Properties:j}{NewLine}{Exception}"
);
public string FormattedEntry { get; set; }
public string Level { get; set; }
public DateTime LogDate { get; set; }
public LogItem(LogEvent logEvent)
{
var renderSpace = new StringWriter();
_textFormatter.Format(logEvent, renderSpace);
FormattedEntry = renderSpace.ToString();
Level = logEvent.Level.ToString();
LogDate = logEvent.Timestamp.DateTime;
}
}
}
我所追求的结果是让每个日志条目显示为折叠的扩展器,其中级别和日期作为标题,格式化的日志条目作为文本内容被删除。我得到的是文本“ext:InAppSink.Logs”中的每个字符都用于创建扩展器对象。为什么这个绑定不起作用?
【问题讨论】:
标签: wpf xaml data-binding