У меня есть приложение WCF, которое регистрирует сообщения. Сообщения отображаются в виде DataGrid
. Каждая строка содержит четыре столбца для времени, типа (например, Debug, Error, Warning…), пространства имен (например, System.Threading
) и самого сообщения.
Каждая строка отображается цветом в зависимости от типа. Например, красный для ошибки. Текст для всей информации (строки / столбцы) в DataGrid
должен отображаться одним и тем же шрифтом.
В XAML видно, что я указал параметры шрифта и цвета шрифта в DataGrid.RowStyle
. «Настройки» - это класс, который содержит свойства для настроек и цветов шрифта.
Моя проблема в том, что время от времени строка отображается с неправильным цветом и / или шрифтом. Может кто-нибудь объяснить, что происходит?
Является ли стиль лучшим способом задания настроек и цветов шрифта? Обратите внимание, что я sh установил эти параметры как динамические c, чтобы пользователь мог изменить их во время выполнения. Любые предложения по стилю или реализации приветствуются.
<DataGrid Name="MessagesGrid" ItemsSource="{Binding Messages}" AutoGenerateColumns="False" IsReadOnly="True">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Setters>
<EventSetter Event="Control.RequestBringIntoView" Handler="RequestBringIntoViewHandler"/>
<Setter Property="FontFamily" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.MessageListFont.FontFamily}" />
<Setter Property="FontSize" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.MessageListFont.Size}" />
<Setter Property="FontWeight" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.MessageListFont.Weight}" />
</Style.Setters>
<Style.Triggers>
<!--colors for different types-->
<DataTrigger Binding="{Binding Type}" Value="Debug">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.DebugBrush}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="Error">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.ErrorBrush}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="Fatal">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.FatalBrush}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="Info">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.InfoBrush}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="Trace">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.TraceBrush}"></Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Type}" Value="Warn">
<Setter Property="Foreground" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=DataContext.Settings.WarningBrush}"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<!--using converter for some fields in case one or more are null.
if null, then display a string (MissingFieldString) indicating it was not in the message-->
<DataGridTextColumn Header="Time">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ResourceKey=NullableTypeConverter}">
<Binding Path="Time" />
<Binding ElementName="MessagesGrid" Path="DataContext.MissingFieldString" />
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="Type">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ResourceKey=NullableTypeConverter}">
<Binding Path="Type" />
<Binding ElementName="MessagesGrid" Path="DataContext.MissingFieldString" />
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="Namespace">
<DataGridTextColumn.Binding>
<MultiBinding Converter="{StaticResource ResourceKey=NullableTypeConverter}">
<Binding Path="Namespace" />
<Binding ElementName="MessagesGrid" Path="DataContext.MissingFieldString" />
</MultiBinding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
<DataGridTextColumn Header="Message" Binding="{Binding Message}"/>
</DataGrid.Columns>