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();

最後に、実行ボタンをクリックすると、カスタム トレース リスナーの書き込みメソッドにダミー メッセージを設定します。

private void Button_Click(object sender, RoutedEventArgs e)
    {            
        Trace.Write(new TraceMessageInfo("Message",Enums.TraceCategory.Error.ToString())); 
    }

構成ファイルで、カスタム トレース リスナーを設定し、デフォルトのものを削除しました。

私の問題は、実行をクリックしてもコレクションに変更がないことです。デバッグしようとすると、コレクションが null として表示されることもあれば、コレクションが変更されたが UI への通知が表示されないこともあります。リストボックスには、カスタム リスナーのコンストラクターで設定したメッセージが 1 つだけ表示されます。

どんな助けでも大歓迎です。

4

1 に答える 1

1

のインスタンスを作成しているため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 に答える