ich habe gerade ein Probem welches ich zwar schon gelöst habe, aber mir gefällt dass so nicht wie ich es gelöst habe. Deswegen wollte ichmal frgane ob es da keine bessere Lösung für das Problem gibt.
Also in meinem ViewModel habe ich eine ObservableCollection mit Einträgen vom Typ Message. Dies ist eine abstrakte Klasse und es hat 3 abgeleitete Klassen: RealtimeMessage, CommandMessage und UnknowMessage. Die ersten beiden haben eine Property namens Typ (ist ein Enum), wo der Typ der Nachricht nochmal spezifiziert ist.
Jetzt wollte ich diese nachrichten in eine Listbox ausgeben, und je nach Klasse und Typ soll der Text der ausgegeben werden soll, eine andere Farbe haben.
also ich habe es folgendermaßen gelöst: Ich habe einen TemplateSelector gebastelt welcher mir je nach Klassentyp und Typ-Feld (Property) das jeweilige Template lädt:
internal class MessageListBoxItemTemplateSelector : DataTemplateSelector
{
public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
{
Message obj = item as Message;
ContentPresenter pres = container as ContentPresenter;
DataTemplate dataTemplate;
if (obj is RealtimeMessage)
{
RealtimeMessage m = (obj as RealtimeMessage);
switch (m.Type)
{
case RealtimeMessageType.Bytecount:
dataTemplate = pres.FindResource("RealTimeMessage_Bytecount_Template") as DataTemplate;
break;
case RealtimeMessageType.Fatal:
dataTemplate = pres.FindResource("RealTimeMessage_Fatal_Template") as DataTemplate;
break;
case RealtimeMessageType.Log:
if (m.Text.Contains("Success") || m.Text.Contains("Sequence Complete"))
dataTemplate = pres.FindResource("RealTimeMessage_Log_Success_Template") as DataTemplate;
else if (m.Text.Contains(",F,") || m.Text.Contains(",W,"))
dataTemplate = pres.FindResource("RealTimeMessage_Log_Error_Template") as DataTemplate;
else
dataTemplate = pres.FindResource("RealTimeMessage_Log_Template") as DataTemplate;
break;
case RealtimeMessageType.State:
if (m.Text.Contains("CONNECTED"))
dataTemplate = pres.FindResource("RealTimeMessage_State_Connected_Template") as DataTemplate;
else
dataTemplate = pres.FindResource("RealTimeMessage_State_Template") as DataTemplate;
break;
default:
dataTemplate = pres.FindResource("RealTimeMessageTemplate") as DataTemplate;
break;
}
}
else if (obj is CommandMessage)
{
switch ((obj as CommandMessage).Type)
{
case CommandMessageType.Success:
dataTemplate = pres.FindResource("CommandMessage_Success_Template") as DataTemplate;
break;
case CommandMessageType.Error:
dataTemplate = pres.FindResource("CommandMessage_Error_Template") as DataTemplate;
break;
case CommandMessageType.End:
dataTemplate = pres.FindResource("CommandMessage_End_Template") as DataTemplate;
break;
default:
dataTemplate = pres.FindResource("CommandMessageTemplate") as DataTemplate;
break;
}
}
else
dataTemplate = pres.FindResource("UnknownMessageTemplate") as DataTemplate;
return dataTemplate;
}
}
im xaml code habe ich dann alle Templates geschrieben:
<UserControl.Resources>
<local:MessageListBoxItemTemplateSelector x:Key="MessageListBoxItemTemplateSelector" />
<DataTemplate x:Key="RealTimeMessageTemplate">
<TextBlock Text="{Binding Text}" Foreground="Gray"/>
</DataTemplate>
<DataTemplate x:Key="RealTimeMessage_Bytecount_Template">
<TextBlock Text="{Binding Text}" Foreground="Red"/>
</DataTemplate>
<DataTemplate x:Key="RealTimeMessage_Fatal_Template">
<TextBlock Text="{Binding Text}" Foreground="Red"/>
</DataTemplate>
<DataTemplate x:Key="RealTimeMessage_Log_Template">
<TextBlock Text="{Binding Text}" Foreground="Gray"/>
</DataTemplate>
<DataTemplate x:Key="RealTimeMessage_Log_Success_Template">
<TextBlock Text="{Binding Text}" Foreground="Green"/>
</DataTemplate>
<DataTemplate x:Key="RealTimeMessage_Log_Error_Template">
<TextBlock Text="{Binding Text}" Foreground="Red"/>
</DataTemplate>
<DataTemplate x:Key="RealTimeMessage_State_Template">
<TextBlock Text="{Binding Text}" Foreground="Blue"/>
</DataTemplate>
<DataTemplate x:Key="RealTimeMessage_State_Connected_Template">
<TextBlock Text="{Binding Text}" Foreground="Green"/>
</DataTemplate>
<DataTemplate x:Key="CommandMessageTemplate">
<TextBlock Text="{Binding Text}" Foreground="Black"/>
</DataTemplate>
<DataTemplate x:Key="CommandMessage_Success_Template">
<TextBlock Text="{Binding Text}" Foreground="Green"/>
</DataTemplate>
<DataTemplate x:Key="CommandMessage_Error_Template">
<TextBlock Text="{Binding Text}" Foreground="Red"/>
</DataTemplate>
<DataTemplate x:Key="CommandMessage_End_Template">
<TextBlock Text="{Binding Text}" Foreground="Gray"/>
</DataTemplate>
<DataTemplate x:Key="UnknownMessageTemplate">
<TextBlock Text="{Binding Text}" Foreground="Blue"/>
</DataTemplate>
</UserControl.Resources>
Da das ganze doch ganz schön viel schreib und verwaltungsarbeit ist wollte ich mal wissen ob man das ganze auch irgendwie schöner und kürzer lösen könnte?