0

我创建了一个继承自 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。列表框仅显示我在自定义侦听器的构造函数中设置的一条消息。

任何帮助将不胜感激。

4

1 回答 1

1

好吧,由于您正在创建 .NET 的实例,因此CustomTraceListener您的视图绑定到与 .NET 跟踪系统不同的实例(它将创建自己的实例)。我会将集合更改为静态实例,因此您将看到所有消息:

private static readonly ObservableCollection<TraceMessageInfo> _traceLogs;
public ObservableCollection<TraceMessageInfo> TraceLogs
{
    get
    {
        return _traceLogs;
    }
}

static CustomTraceListener()
{
    _traceLogs = new ObservableCollection<TraceMessageInfo>();
    _traceLogs.Add(new TraceMessageInfo("Message", Enums.TraceCategory.Information.ToString()));
}
于 2013-07-06T18:54:26.483 回答