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 つだけ表示されます。
どんな助けでも大歓迎です。