我创建了一个继承自 TraceListner 类的自定义跟踪侦听器。实际上这个想法是在应用程序中使用 Trace.Write 方法,该方法应该更新自定义跟踪侦听器类中的 Observable 集合,该类可以绑定到框架元素。
这是我的自定义跟踪侦听器:
public class CustomTraceListener : TraceListener, INotifyPropertyChanged
{
private ObservableCollection<TraceMessageInfo> _traceLogs;
public ObservableCollection<TraceMessageInfo> TraceLogs
{
get
{
return _traceLogs;
}
set
{
_traceLogs = value;
OnPropertyChanged("TraceLogs");
}
}
public CustomTraceListener()
{
if (TraceLogs == null)
{
TraceLogs = new ObservableCollection<TraceMessageInfo>();
TraceLogs.Add(new TraceMessageInfo("Message", Enums.TraceCategory.Information.ToString()));
}
}
public override void Write(object traceMessageInfo)
{
TraceLogs.Add(new TraceMessageInfo("New message", Enums.TraceCategory.Information.ToString()));
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
}
这是我用来将可观察集合绑定到 ListBox (WPF) 的 xaml。
<StackPanel Grid.Row="1" Name="TraceLogStackPanel">
<ListBox Name="lbTraceViewer" ItemsSource="{Binding TraceLogs, Mode=TwoWay}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Width="700" Background="{Binding Category,Converter={StaticResource TraceCategoryToColorConverter}, Mode=TwoWay}">
<Label Content="{Binding Message, Mode=TwoWay}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
在构造函数中,我将堆栈面板的数据上下文设置为这个新的跟踪侦听器。
this.TraceLogStackPanel.DataContext = new CustomTraceListener();
最后,在单击执行按钮时,我正在为我的自定义跟踪侦听器的 write 方法设置一条虚拟消息。
private void Button_Click(object sender, RoutedEventArgs e)
{
Trace.Write(new TraceMessageInfo("Message",Enums.TraceCategory.Error.ToString()));
}
在配置文件中,我设置了自定义跟踪侦听器并删除了默认侦听器。
我的问题是,当我单击执行时,集合没有变化。有时,当我尝试调试时,它显示我的集合为空,有时它显示我的集合已更改,但没有通知 UI。列表框仅显示我在自定义侦听器的构造函数中设置的一条消息。
任何帮助将不胜感激。