SilverLight – ListBox mit multiplen ListBoxItem Templates

Abgelegt unter: Allgemeines am: 10. November 2010 | | Kommentare (2)

Manchmal macht es Sinn die ListBoxItems in der ListBox unterschiedlich darzustellen. Um dies zu machen müsste man das Template beim Erstellen eines ListBoxItems zuweisen. Das ganze kann man leicht mit einem einfachen ValueConverter erreichen.

Angenommen wir haben in unseren Model eine Eigenschaft anhand deren wir das Template wählen möchten. Falls man Objekte mit unterschiedlichen Typen bindet und anhand des Typen das Template wählen möchte dann bindet man das ganze Objekt an die Style Eigenschaft des ListBoxItems und passt den Converter dem entsprechend an.

public enum ItemType
{
	Default,
	Editable
}
 
public class ItemViewModel : INotifyPropertyChanged
{
	private ItemType _type;
	public ItemType ItemType
	{
		get { return _type; }
		set
		{
			if (value != _type)
			{
				_type = value;
				NotifyPropertyChanged("ItemType");
			}
		}
	}
 
	...

Damit man aus dem ValueConverter der kein FrameworkElement ist trozdem Ressourcen findet brauchen wir eine Helper Klasse die nach Ressourcen sucht. Man könnte es auch weglassen aber ich finde die Klasse ziemlich hilfreich.

public static class ResourceHelper
{
	public static object FindResource(string name)
	{
		if (App.Current.Resources.Contains(name))
			return App.Current.Resources[name];
		else
		{
			FrameworkElement root = App.Current.RootVisual as FrameworkElement;
			return root.FindResource(name);
		}
	}
 
	internal static object FindResource(this FrameworkElement root, string name)
	{
		if (root != null && root.Resources.Contains(name))
			return root.Resources[name];
		else
		{
			try
			{
				return root.FindName(name);
			}
			catch { }
		}
 
		return null;
	}
}

Der ValueConverter konvertiert den gebundenen Wert in die Ressource. Die ConvertBack Methode braucht man in diesem Fall nicht.

public class ListBoxItemTemplateConverter : IValueConverter
{
	public object Convert(object value, System.Type targetType, object parameter, 
		System.Globalization.CultureInfo culture)
	{
		return ResourceHelper.FindResource(string.Format("ListBoxItem{0}Style", 
			value.ToString())); 
	}
 
	public object ConvertBack(object value, System.Type targetType, object parameter, 
		System.Globalization.CultureInfo culture)
	{
		throw new System.NotImplementedException();
	}
}

Jetzt muss man die eigentlichen Ressourcen definieren, es sind Styles mit dem TargetType ListBoxItem

<local:ListBoxItemTemplateConverter x:Key="ListBoxItemTemplateConverter"/>
 
<Style x:Key="ListBoxItemDefaultStyle" TargetType="ListBoxItem">
	<Setter Property="Template">
		<Setter.Value>
			<ControlTemplate TargetType="ListBoxItem">
				<StackPanel Margin="0,0,0,17" Width="432" >
					<TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" 
						Style="{StaticResource PhoneTextExtraLargeStyle}"/>
					<TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" 
						Margin="12,-6,12,0" 
						Style="{StaticResource PhoneTextSubtleStyle}"/>
				</StackPanel>
			</ControlTemplate>
		</Setter.Value>
	</Setter>
</Style>
 
<Style x:Key="ListBoxItemEditableStyle" TargetType="ListBoxItem">
	<Setter Property="Template">
		<Setter.Value>
			<ControlTemplate TargetType="ListBoxItem">
				<StackPanel Margin="0,0,0,17" Width="432" >
					<TextBox Text="{Binding LineOne, Mode=TwoWay}" />
					<TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" 
						Margin="12,-6,12,0" 
						Style="{StaticResource PhoneTextSubtleStyle}"/>
				</StackPanel>
			</ControlTemplate>
		</Setter.Value>
	</Setter>
</Style>

Und jetzt kommt der eigentliche Trick, man erstellt ein DataTemplate in der ein ListBoxItem ist dessen Style Eigenschaft über den ValueConverter an die Eigenschaft des Models gebunden ist. Der ValueConverter gibt dann einfach die passende Ressource zurück. Dieser Trick klappt ohne Probleme in Blend.

<ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" 
	SelectionChanged="MainListBox_SelectionChanged">
	<ListBox.ItemTemplate>
		<DataTemplate>
			<!-- is blendable if you use sample data -->
			<ListBoxItem Style="{Binding Path=ItemType, 
				Converter={StaticResource ListBoxItemTemplateConverter}}" />
 
			<!-- Bind a item  -->
			<!--<ListBoxItem Style="{Binding 
				Converter={StaticResource ListBoxItemTemplateConverter}}" /> --> 
 
			<!-- Works only after compiling -->
			<!--<ListBoxItem Style="{Binding Path=ListBoxItemStyle}" /> --> 
		</DataTemplate>
	</ListBox.ItemTemplate>
</ListBox>

So ‘ne Scheiße

Abgelegt unter: Allgemeines am: 14. Juli 2010 | | Kommentare (1)

Das Gewitter forderte seinen Tribut, nicht nur die Deutsche Bahn hatte damit Probleme ^^

Owned

Jüchener Tagebau

Abgelegt unter: Photography am: 18. Juni 2010 | | Kommentare (0)



Spaß muss auch sein :D

Abgelegt unter: Computer Graphics, MD.H - Uni am: 16. Juni 2010 | | Kommentare (0)

Dot.Animator

Abgelegt unter: MD.H - Uni, Programmierung am: 15. Juni 2010 | Schlagwörter:, | Kommentare (0)

Es ist ziemlich lange her, dass ich hier was geschrieben hab, eigentlich habe ich genug was ich Posten könnte leider aber keine zeit im in Ruhe das ganze zum Ausdruck zu bringen. Für diesen Beitrag brauche ich nicht so viel Zeit also hier ist er :)

Im Rahmen des Modules “Künstliche Intelligenz” in meinem Studiengang gehen wir aktuell zelluläre Automaten, Turingmaschinen und Ähnliches durch, dazu habe ich mal ein kleines Tool gebastelt in dem ich solche Animationen wie das Spiel des Lebens oder Langtons Ameise testen kann.

Hier zum Tool: Dot.Animator

Balance It

Abgelegt unter: Game Design am: 9. Februar 2010 | | Kommentare (0)

Balance IT is ein Puzzle Spiel vom Squirrel Studios für das iPhone. Es kombiniert Geschicklichkeitselemente mit der Fähigkeit des Spielers langfristig zu planen. Die allgemeine Motivation entsteht, beim knacken des Highscores welches theoretisch, bis ins unendliche gehen kann.





Firm Projekt – EOS

Abgelegt unter: Allgemeines am: | | Kommentare (0)

Hi, an der Uni machen wir zurzeit ein Filmprojekt, wir machen ziemlich viel mit 3D wahrscheinlich weil von uns keiner so richtig schauspielern kann XD

Jedenfalls wollte ich mal eine der Szenen aus dem Film zeigen, die Szene wurde mit 3ds Max, After Effects und etwas Photoshop erstellt :)


Foo

XmlContentWriter

Abgelegt unter: Game Design, Programmierung am: 2. April 2009 | Schlagwörter:, , | Kommentare (0)

Der folgender Code speichert eine Instanz als XML Format, die generierte XML Datei kann man als XNA Content wieder in einem Spiel benutzen. Normalerweise macht man so was nicht, aber im Falle eines Editors oder einer ähnlichen Anwendung ist das schon praktisch.

using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Intermediate; 
 
namespace arusslabs.Xna.Content.Pipeline 
{ 
    public static class XmlContentWriter 
    { 
        public static void Write(object value, string filePath) 
        { 
            XmlWriterSettings xmlSettings = new XmlWriterSettings(); 
            xmlSettings.Indent = true; 
 
            using (XmlWriter xmlWriter = XmlWriter.Create(filePath, xmlSettings)) 
                IntermediateSerializer.Serialize(xmlWriter, value, null); 
         } 
    } 
}

Das einzige nervige ist, dass man die drei Klassen (ContentReader, ContentWriter und die Content Klasse selber) immer gleich halten muss, das heißt die Reihenfolge wie die Eigenschaften in der eigentlichen Klasse angeordnet sind und wie die gelesen oder geschrieben werden.

XNA Content Editor

Abgelegt unter: Game Design, Programmierung am: 11. März 2009 | Schlagwörter:, , | Kommentare (0)

Das 2D Projekt läuft heiter weiter :-D und jetzt bin ich dabei einen passenden Editor für meine “Engine” zu bauen. Der Editor ist eine MDI Andwendung für die Docking Spielereien habe ich die WeifenLuo DockPanel Suite genommen.

Für die WinForm XNA Lösung gibts ein gutes Beispiel auf der XNA Creators Webseite WinForms Series 1: Graphics Device.

Naja soweit so gut die basics sind da, jetzt fängt aber der schwieriger Teil an :-D .

Düsseldorf Flughafen

Abgelegt unter: Photography am: 9. März 2009 | Schlagwörter: | Kommentare (0)