.
Anmeldung | Registrieren | Hilfe

.NET-Blogs Archiv August 2011

ASP.NET Skillscamp 2011–Der Tag danach

30.08.2011 13:40:00 | Jan Christian Selke

Das war es also, das erste ASP.NET Skillscamp (@Skillscamp) 2011 in Köln und gleichzeitig das erste Community Event, an dem ich teilgenommen habe. Alles in allem kann ich, zumindest für mich, eine positive Bilanz ziehen: Ich durfte interessante Personen kennen lernen, deren Bilder und Artikel ich bisher nur kannte, und an vielen, zum Teil spannenden Gesprächen teilnehmen.

Hier folgt nun meine kurze, persönliche Zusammenfassung der Tage.

Freitag - Das Vorspiel

Der Freitag Abend begann um 19.00h in Peters Brauhaus in der Kölner Altstadt und Albert Weinert (seines Zeichens der Organisator) nahm die Teilnehmer in Empfang. Nach und nach (je nach Verspätung der öffentlichen Verkehrsmittel) trudelten die Meisten bis auf wenige Ausnahmen auch ein. Mit zunehmenden Kennenlernen (wobei sich viele der üblichen Verdächtigen bereits kannten), ersten Gesprächen und auch den ersten Kölsch kamen die Themen für den Open Space Samstag zusammen. Es kristallisierte sich relativ schnell heraus, dass ein großer Schwerpunkt auf Javascript und den verschiedenen Frameworks, vor allem Knockout.js, Backbone.js und Node.js, liegen würde. Nicht Fehlen durften natürlich auch Themen wie ASP.NET MVC, HTML5 und REST mit WCF.

Mein persönliches (Negativ-)Highlight des abends hatte allerdings nicht primär mit der Veranstaltung zu tun, sondern dem Chaos und Anarchie ÖPNV. Der hat dafür gesorgt, dass ich nachts die Strecke vom Kölner Bahnhof nach Bonn-Beuel im Fabelrekord von unglaublichen 2,75 Stunden (in Worten: zwei Stunden und fünfundvierzig Minuten) zurückgelegt habe. Vielen Dank noch an dieser Stelle für die unglaubliche Unterstützung des VRS, ohne den diese Leistung nie möglich gewesen wäre!

Samstag - Der Open Space

Samstag morgen standen wir erst einmal mit versammelter Mannschaft vor verschlossener Tür, weil irgendein Spaßvogel die Tür zufallen lassen hat. Macht nix, wir standen schließlich fast alle draußen Zwinkerndes Smiley

Nach der Begrüßung und allgemeinen Vorrede zum Skillscamp durch Albert, wurde der Session Plan, vorerst nur für den Vormittag, zusammen gestellt. Aufgrund des allgemeinen Interesses und der relativ kleinen Zahl an Teilnehmern, gab es dann morgens auch nur eine erste Session zum Thema Javascript Frameworks - die auch gleich den größten der bereitstellten Räume der GFU sprengte. Diese erste Session war dann vor allem durch die Ausführungen von Albert geprägt.

Die zweite Session konnte auf zwei Slots aufgeteilt werden. Für die Einen gab es Node.js, für die Anderen Html5 (darüber kann ich leider nichts berichten). Der Versuch in der zweiten Session, unter der Schirmherrschaft von Daniel Fisher, IISNode.js auf dem IIS zum Laufen zu bringen, scheiterte leider. Es war zwar relativ schnell eine lauffähige Version anhand des Blogs von Tomek (der die letzten Tage ziemlich Kreise gelaufen hat) aufgesetzt, der Versuch eine eigene Seite anzuzeigen scheiterte jedoch. Und leider nicht nur das: Abgesehen davon, dass der Webserver einen 503er Fehler generierte, wurden zudem keinerlei brauchbare Loginformationen in die Logdatei oder das Eventlog geschrieben. Damit war relativ schnell (vorerst) der Stempel “noch nicht produktionstauglich” vergeben (Vielleicht war es aber auch nur die lang überfällige Zigarettenpause Zwinkerndes Smiley ! Mittlerweile ist ein Lösungsansatz von LennyBacon bei Scott Hanselman gefunden worden)…
Weiter ging es zur Lokalisation mit ASP.NET MVC in Session 3, der letzten vor dem Mittagessen. Hier war es mal wieder Daniel Fisher, der, auf eine konkrete Frage zur Lokalisation von Thomas Bandt hin, alle Möglichkeiten der Lokalisierung vom Server bis zum Client vorstellte.

Nach dem Mittagessen, wurde die Planung des Nachmittags vorgenommen. Schon etwas auffällig war, dass Daniel Fisher einen sehr unruhigen Arm hat, wenn es um die Frage geht, wer mit einer bestimmten Technologie/einem bestimmten Framework bereits Erfahrung hat und darüber auch berichten möchte/kann. Dementsprechend wurde der Nachmittag wieder vor allem durch Albert und Daniel geprägt, insgesamt fand aber viel mehr Interaktion statt als noch am Vormittag. Grund war sicherlich auch, dass das erste Thema nach dem Mittag “Best-Practices in MVC” war und fast jeder in Form von Erfahrungen oder aber konkreter Fragen dazu beitragen konnte.

Auf den Themenkomplex REST und WCF wurde bewusst verzichtet. Der einzige, der zu diesem Thema aktiv mitgestalten konnte/wollte, war, wie konnte es auch mal wieder anders sein: Daniel Fisher… Und da er seine Meinung als nicht unbedingt massenkompatibel bezeichnete und Alexander Zeitler kurzfristig abgesagt hatte, wurde das Thema fallen lassen (kleiner Wink mit dem Zaunpfahl an dieser Stelle an Alexander Zeitler!).

Den Abschluss des Tages bildete schließlich ein Rundflug durch das Javascript-Tooling und sämtliche Javascript Frameworks, die von den Teilnehmern schon einmal eingesetzt wurden (für besondere Erheiterung sorgte: raptorize your screen Smiley) mit einer kleinen Vorstellung über Inhalt und Funktionsweise. Hier kam wirklich fast alles mal kurz auf den Tisch, ich könnte bestimmt nur noch die Hälfte nennen…

Das Nachspiel

Den abendlichen Nachgesang konnte ich dann aus persönlichen Gründen nicht mehr aktiv miterleben (gut unterrichteten Quellen war aber zu entnehmen, dass es bis spät in die Nacht ging). Ich habe mir aber für das nächste Mal vorgenommen auch hier dabei zu sein.

Zum Schluss bleibt mir nur noch anzumerken, dass es mir persönlich sehr gefallen hat. Allein schon deshalb, dass man Gesicherten und Texten reale Personen zuordnen und diese kennen lernen konnte. Organisatorisch hätte mir persönlich eine Aufteilung in kleinere Gruppen besser gefallen, da das mit Sicherheit eine intensivere, tiefer gehende Diskussion in der einzelnen Session erlaubt hätte, als es letztlich in den/der großen Gruppe möglich gewesen ist. Und ansonsten ließe sich sicher auch die eine oder Andere kleine Optimierung finden. Entgegen des häufig geäußerten Wunsches von Albert, dass sich alle in die Runde einbringen, lief es doch zu Teil zu sehr auf ein reines konsumieren hinaus. Alles in allem war es aber aus meiner Sicht ein gelungenes erstes (Wink an Albert!) Skillscamp und ich freue mich schon auf die Fortsetzung.

Sollte ich etwas vergessen haben, könnt ihr mich gerne anschreiben und ergänzen oder einfach selbst noch einmal etwas dazu schreiben.

Es bleibt mir nur noch einmal Albert Weinert herzlich für die Idee, Planung/Organisation und Durchführung zu Danken und ebenso allen Sponsoren, die das erste Skillscamp überhaupt möglich gemacht haben. Bis zum nächsten Mal!

Veranstaltungshinweis für Softwarehersteller: European Software Conference

26.08.2011 12:10:25 | Peter Kirchner

Für Softwarehersteller durchaus interessant könnte die diesjährige European Software Conference (ESWC) am 19. und 20. November in London wieder sein. Zum sechsten Mal wird der Epsilon Award® verliehen, eine jährliche Anerkennung hervorragender Software, die für den Geschäftsbereich oder auch den Privatgebrauch entwickelt wurden. Nominierungen für den Epsilon Award sind bis zum 4. September möglich und können (auf Englisch) eingereicht werden. 

Infos und Anmeldelink finden Sie auf http://abstimmung.europeansoftwareconference.de/ 

Anschließend findet bis zum 27. Oktober Public Voting statt.  Der Gewinner wird am Samstag, den 19. November im Konferenzhotel Hilton Westend bekanntgegeben und ausgezeichnet. Kontakt zu dieser Veranstaltung, die übrigens nicht von Microsoft veranstaltet wird, können Sie über David Boventer aufnehmen. (Gründer und Vorsitzender, European Software Conference (ESWC e.V.), Tel. +49 1522 1618450 , (Fax) +49 321-211 25826 dboventer@euroconference.org)

Ich persönlich hatte die Gelegenheit die ESWC vor zwei Jahren in Berlin zu besuchen und man kann dort sehr viele Kontakte innerhalb der Zunft der Softwarehersteller aufbauen. Allen Teilnehmern, die dieses Jahr die Gelegenheit haben, nach London zur ESWC zu reisen, wünsche ich viel Erfolg und Spaß dabei!

Und in eigener Sache, vergessen Sie bitte nicht, auch uns über Ihre Softwarelösungen zu informieren und von unserer Betreuung über Microsoft Platform Ready zu profitieren.

Alm Days 2011: Brian Harry und Sam Guckenheimer

25.08.2011 19:00:00 | Christian Binder

In den letzten vier Wochen war ich Redmond und habe in Aaron Bjork’s Team an vNext gearbeitet, während die meisten Kollegen in den Sommerurlaub geflüchtet sind. Vorweg die 4 Wochen waren es wert und mein Urlaub beginnt heute. Im November stehen ja die Visual Studio ALM Days 2011 an und Brian Harry und Sam Guckenheimer werden in München sein, um die Keynotes zu halten, daher habe ich beide zu einem kleinen Interview eingeladen.

Mit Brian spreche ich 3min über die Prioritäten von vNext. Ich bitte Videoqualität zu entschuldigen, da Brian nicht in Redmond sondern in North Carolina sitzt und ich das Interview über Videotelefonie aufgenommen habe. Meine Schuld, die Idee für das Video kam mir erst später, da war Brian nicht mehr in Redmond.

Sam habe ich direkt auf dem Campus getroffen. Thema sind die aktuellen ALM Trends und alles in Deutsch:

Team Foundation Server Power Tools August 2011

25.08.2011 15:00:39 | Christian Binder

Die aktuelle Version ist hier in der VS Gallery verfügbar. Unter anderem sind folgende Erweiterungen mit dabei:

Workitem Suche aus Visual Studio heraus:

image

VC Rollback im Source Control Explorer (vorher nur via TF Commandline verfügbar) :

image

TT.DataForm: MVVM Support

25.08.2011 07:47:00 | Jörg Neumann

Bei der Entwicklung von TT.DataForm habe ich besonderen Wert auf den MVVM-Support gelegt. Dies betrifft sowohl die Datenbindung, als auch die Operationen die der Benutzer über die Oberfläche auslösen kann. Hierfür stehen entsprechende Command-Eigenschaften bereit, mit denen einen ViewModel das Control steuern kann.
  • AddCommand: Legt einen Command für die Neuanlage eines Datensatzes fest.
  • RemoveCommand: Legt einen Command für das Entfernen von Datensätzen fest.
  • SelectionButtonCommand: Legt den Command für die Auswahlschaltfläche von Bildern fest.
Für die Navigation stehen keine separaten Commands zu Verfügung, da diese idealerweise über eine entsprechende die Datenquellen-View, wie ICollectionView oder IEditableCollectionView gesteuert werden können.

In manchen Fällen muss das ViewModel jedoch aktiv mit der DataForm kommunizieren. So sollte zum Beispiel vor dem Speichern der Änderungen die aktive Eingabe abgeschlossen werden, um den gerade eingegebenen Wert in die Datenquelle zu übertragen. Hierfür stellt DataForm die Methode AcceptChanges().

Da das ViewModel jedoch nicht direkt mit der Komponente kommunizieren kann, werden die wichtigsten Methoden in einem so genannten ActionCommand abstrahiert. Hierbei stellt das ViewModel eine Eigenschaft vom Typ ActionCommand zu Verfügung, die an die gleichnamige Eigenschaft der DataForm gebunden wird. Daraufhin kann das ViewModel über die ExecuteAction()-Methode die entsprechende Methode auf dem Command aufrufen, welche daraufhin an die DataForm weitergeleitet wird. ExcuteAction() nimmt den Typ der Methode in Form eines Wertes der DataFormAction-Enumeration entgegen. Die folgenden Werte stehen hierbei zu Verfügung:
  • AcceptChanges: Übernimmt die über die Oberfläche durchgeführten Änderungen.
  • DetachDataSource: Entfernt die Datenquelle und die zugehörigen UI-Elemente aus dem Control.
  • Reset: Erstellt die Oberfläche anhand Datenquelle neu.
  • SetBusy: Sperrt die Oberfläche und blendet den BusyIndicator ein.
  • SetAvailable: Blendet den BusyIndicator aus und entsperrt die Oberfläche.
Das folgende Beispiel demonstriert die Anwendung:

View:
<dataform:DataForm
  ActionCommand="{Binding ActionCommand}" />


ViewModel:

public ActionCommand ActionCommand { get; set; }

private void SaveChanges()
{
  this.ActionCommand.ExecuteAction(
    DataFormAction.AcceptChanges, null);
  this.ActionCommand.ExecuteAction(
    DataFormAction.SetBusy, null);
  …
}


Der Wert DataFormAction.SetBusy bewirkt hierbei, dass alle Eingabefelder deaktiviert werden und der eingebaute BusyIndicator eingeblendet wird.

BusyIndicator

Der Wert DataFormAction.SetAvailable beendet die Animation wieder.

Zusätzlich bietet TT.DataForm die folgenden Eigenschaften, mit denen das Verhalten der Oberfläche konfiguriert werden kann.

Eigenschaft Beschreibung
AllowAddNew Bestimmt, die Neuanlage eines Datensatzes über das Steuerelement möglich sein soll.
AllowRemove Bestimmt, das Entfernen eines Datensatzes über das Steuerelement möglich sein soll.
IsReadOnly Bestimmt, ob das Steuerelement schreibgeschützt dargestellt werden soll.
Error Liefert den aktuellen Eigabefehler oder einen Leerstring zurück.
HasError Ruft ab, ob der aktuelle Datensatz Eingabefehler enthält.
IsBusy Legt fest, ob der Busy Indicator angezeigt werden soll.
BusyIndicatorType Legt den Typ des Busy Indicators fest. Zur Auswahl stehen Wheel, Dots und Custom. Bei letzterem Wert muss über die Eigenschaft BusyIndicatorTemplate ein benutzerdefiniertes Template bereitgestellt werden.

Das Beispielprojekt, das in den Sourcen von TT.DataForm enthalten ist, zeigt die Verwendung der verschiedenen Mechanismen in einem MVVM-Szenario.

TT.DataForm: UI Customizing

24.08.2011 07:59:00 | Jörg Neumann

In diesem Post soll es um die Anpassung der einzelnen UI-Bestandteile von TT.DataForm gehen.
TT.DataForm besteht aus einer Reihe von Unterkomponenten, die über Styles und Templates separat angepasst werden können. Hierzu zählen:
  • DataFormHeader: Der Kopfbereich des Controls (Titel, Navigation)
  • Marker: Markierungssymbole (aktives Feld, geändertes Feld, Pflichtfeld, Fehler)
  • DataFormItem: Ein Feldzeile mit Bezeichner, Eingabeelement, sowie den Markern.
  • DataFormFooter: Der Fußbereich des Controls (Beschreibungstext, Fehlertext).
  • BusyIndicator: Der eingebaute BusyIndicator der DataForm.
Die folgende Abbildung zeigt den internen Aufbau:TTDataFormCustomizing

Hierbei beschreiben die gelben Kästchen die jeweilige Komponente mit ihren Eigenschaften, während die grünen Kästchen die zugehörigen DataForm-Eigenschaften kennzeichnen, mit denen Anpassungen vorgenommen werden können.

Um beispielsweise die Symbole der Navigationsleiste zu ändern, können über HeaderStyle die Eigenschaften des DataFormHeader-Objekts verändert werden.

<dataform:DataForm x:Name="personDataForm">
  <dataform:DataForm.HeaderStyle>
    <Style TargetType="dataform:DataFormHeader">
      <Setter Property="Background"
        Value="LightYellow" />
      <Setter Property="MoveFirstImage"
        Value="/Images/Navigation_First.png" />
      <Setter Property="MovePreviousImage"
        Value="/Images/Navigation_Previous.png" />
      <Setter Property="MoveNextImage"
        Value="/Images/Navigation_Next.png" />
      <Setter Property="MoveLastImage"
        Value="/Images/Navigation_Last.png" />
      <Setter Property="AddImage"
        Value="/Images/New.png" />
      <Setter Property="RemoveImage"
        Value="/Images/Delete.png" />
    </Style>
  </dataform:DataForm.HeaderStyle>
</dataform>


Darüber hinaus stehen eine Reihe allgemeiner Eigenschaften bereit, mit denen grundsätzliche Entscheidungen des Erscheinungsbilds festgelegt werden können. Die folgende Tabelle zeigt die hierfür wichtigsten Einstellungen:

Eigenschaft Beschreibung
RowHeight Bestimmt die Höhe einer Feldzeile.
ColumnSpacing Bestimmt den Abstand zwischen Anzeigetext und Eingabesteuerelement.
ColumnCount Legt die Anzahl der anzuzeigenden Spalten fest.
ShowHeader Bestimmt, ob der Kopfbereich angezeigt werden soll.
ShowFooter Bestimmt, ob der Fußbereich angezeigt werden soll.
ShowEditTracker Bestimmt, ob das Symbol für geänderte Felder angezeigt werden soll.
ShowRowMarker Bestimmt, ob das Symbol für das aktuell fokussierte Felder angezeigt werden soll.
ShowRequiredFieldMarker Bestimmt, ob das Symbol für Pflichtfelder angezeigt werden soll.
ShowErrorMarker Bestimmt, ob das Symbol für Eingabefehler angezeigt werden soll.
CornerRadius Legt den Radius des äußeren Rahmens fest.
ShowDropShadow Zeichnet einen Schatteneffekt für das Steuerelement.

Noch mehr Beispiele für die Anpassungsmöglichkeiten finden Sie im Demoprojekt, das den Sourcen von TT.DataForm beiliegt.

ALM Days 2011: Brian Harry im Interview mit Chris Binder

23.08.2011 14:00:00 | Peter Kirchner

Auf den Visual Studio ALM Days 2011 können Sie die nächste Generation der Entwicklertools für Windows, Web, Phone und die Cloud live erleben.

Brian Harry im Interview mit Chris Binder

In diesem Drei-Minuten-Kurzinterview berichtet Brian Harry – der „Vater“ von Team Foundation Server (und Visual SourceSafe) – was Anwender von der kommenden Version von Team Foundation Server und Visual Studio erwarten dürfen und erklärt die vier Top-Prioritäten bei der Entwicklung der nächsten Version von Visual Studio:

  1. Raving Fans
  2. Agile Development
  3. Lightweight Requirements Management /w Feedback Loop
  4. Team Foundation Server in the Cloud

Die Videoqualität ist leider nicht sonderlich beeindruckend, da das Video über eine schwache Internetverbindung mittels Videotelefonie aufgezeichnet wurde, aber die Tonqualität ist hervorragend und wenn Sie ein besseres Bild von Brian Harry möchten, kommen Sie einfach auf die ALM Days im November in München:

Brian Harry wird auf den Visual Studio ALM Days vom 23. bis 25. November in München diese und weitere Neuerungen live vorstellen. Alle Informationen zu den Visual Studio ALM Days 2011 finden Sie auf der Website der Microsoft Visual Studio ALMDays 2011.

Neben der Session von Brian Harry erwarten Sie auf den ALM Days weitere Keynotes von Microsoft-Sprechern aus Redmond wie Sam Guckenheimer -- Product Planner für Visual Studio – und lokale Experten wie Christian Binder, ALM Architect bei Microsoft Deutschland, sowie Fallstudien und Workshops von unabhängigen  Partnern und Anwender.

TT.DataForm: Mappings

23.08.2011 07:12:00 | Jörg Neumann

Nachdem ich hier bereits die Data Binding-Mechanismen von TT.DataForm beschrieben habe, soll es in diesem Post um die Anpassung der UI-Generierung gehen. Hierfür stehen zwei Modelle zu Verfügung: Control Mappings und Item Definitions.

Control Mappings

Mit den Control Mappings kann konfiguriert werden, in welcher Form die zu Verfügung gestellten Daten in UI-Elemente umgesetzt werden sollen. Standardmäßig verfolgt TT.DataForm das folgende Mapping:

Datentyp Input Control
int, double, decimal NumericUpDown
string TextBox
DateTime DatePicker
bool CheckBox
ImageSource Image
Sonstige TextBlock

Um dieses Mapping anzupassen, können ControlMapping-Objekte definiert und über die ControlMapping-Eigenschaft zugewiesen werden. Hierbei stehen die folgenden Möglichkeiten zu Verfügung:
  • Mapping auf Feldebene
  • Mapping auf Datentypebene
  • Definition eines DataTemplate
  • Angabe von Metadaten
Hier ein paar Beispiele:

<dataform:DataForm.ControlMappings>
  <dataform:ControlMapping ControlType="{x:Type TextBox}"
                           BindingPropertyName="Text"
                           DataPropertyName="Id" />
  <dataform:ControlMapping DataType="{x:Type sys:String}"
                           ControlType="{x:Type TextBlock}"
                           BindingPropertyName="Text" />
  <dataform:ControlMapping DataType="{x:Type sys:DateTime}"
                           IsReadOnly="True"
                           Description="The birthday.">
    <dataform:ControlMapping.ColumnTemplate>
      <DataTemplate>
        <TextBox Text="{Binding Path=Birthday,
                        StringFormat={}{0:dd. MMMM yyyy}}"
                        IsReadOnly="False" />
      </DataTemplate>
    </dataform:ControlMapping.ColumnTemplate>
  </dataform:ControlMapping>
</dataform:DataForm.ControlMappings>


In diesem Beispiel wurde festgelegt, dass die Eigenschaft Id als TextBox (statt als NumericUpDown) gerendert und hierbei die Text-Eigenschaft gebunden werden soll. Darüber hinaus wurde festgelegt, dass alle Eigenschaften vom Typ string in Form von TextBlock (statt TextBox) dargestellt werden. Für den Datentyp DateTime wurde zusätzlich festgelegt, dass alle Felder des Typs schreibgeschützt dargestellt werden sollen. Diese Art der Metadatenangabe kann sinnvoll sein, wenn die Datenquelle nicht mit Data Annotations attributiert wurde, bzw. die Angaben überschrieben werden soll. Zuletzt wurde für das Feld Birthday ein eigenes DataTemplate definiert. Dies kann dann sinnvoll sein, wenn das zu erzeugende UI-Control speziell konfiguriert oder das Binding zum Beispiel mit einem ValueConverter versehen werden muss.

Item Definitions

Die Item Definitions erfüllen im Grunde den gleichen Zweck wie die Control Mappings, erlauben hierbei jedoch weitaus mehr Anpassungsmöglichkeiten. So kann zum Beispiel nicht nur das Eingabeelement, sondern auch das Anzeigeelement festgelegt werden. Darüber hinaus können Item Definitions sowohl für gebundene, als auch für ungebundene Felder definiert werden. Das bedeutet, dass die Oberfläche zum Beispiel ein Notizfeld enthalten kann, obwohl die Datenquelle keine entsprechende Eigenschaft bereitstellt.
Die Erstellung von Item Definitions erfolgt über die Eigenschaft DataFormItems. Hierüber können ein oder mehrere DataFormItem-Objekte zugewiesen werden. Diese bestimmen über die Eigenschaften Header und Content den Anzeigetext bzw. das zu verwendende Eingabeelement.
Hier ein Beispiel für die Definition von Item Definitions:

<dataform:DataForm.DataFormItems>
  <dataform:DataFormItem Header="ID:">
    <dataform:DataFormItem.Content>
      <controls:NumericUpDown Width="100"
       
HorizontalAlignment="Left"
        Value="{Binding Path=Id, ValidatesOnDataErrors=True}"/>
    </dataform:DataFormItem.Content>
  </dataform:DataFormItem>
  <dataform:DataFormItem>
    <dataform:DataFormItem.Header>
      <TextBlock Text="Name:" />
    </dataform:DataFormItem.Header>
    <dataform:DataFormItem.Content>
      <TextBox Text="{Binding Path=Name}" />
    </dataform:DataFormItem.Content>
  </dataform:DataFormItem>
</dataform:DataForm.DataFormItems>


Wie zu sehen ist, kann die Header-Eigenschaft entweder mit einem einfachen Text, oder mit einem beliebigem Control gefüllt werden.

Im nächsten Post geht es um die grafischen Anpassungsmöglichkeiten von TT.DataForm.

Darauf hat die Welt gewartet… vielleicht?

22.08.2011 20:22:01 | dotnet-kicks.de Blog

"Was dem Einzelnen nicht möglich ist, das Vermögen viele."

Download für Windows Phone

Kick me!

TT.DataForm: Data Binding

22.08.2011 10:59:00 | Jörg Neumann

Nach der kurzen Einführung hier, gehe ich in den folgenden Posts näher auf die Features von TT.DataForm ein. Den Anfang mache ich mit dem Thema Data Binding.

Datenquellen

Eine Datenquelle bindet man an TT.DataForm über die Eigenschaft DataSource. Hierbei kann eine beliebige Datenquelle angegeben werden – unabhängig davon ob es sich um eine einzelnes Objekt oder eine Liste handelt. Die folgenden Datentypen werden hierbei unterstützt:
  • System.Object
  • System.Type
  • IEnumerable
  • ICollectionView
  • CollectionViewSource
  • ListCollectionView
Darüber hinaus kann TT.DataForm auch mit dem Data Source Windows von Visual Studio verknüpft werden, dass ein direktes Einfügen aus der Toolbox möglich ist.
DataSourceWindow_thumb4

Metadaten

Die Generierung der Oberfläche erfolgt auf Grundlage von Metadaten, welche die Datenquelle in Form von Data Annotations bereit stellt. So werden zum Beispiel die Labels mit den Anzeigenamen belegt, die über das Display-Attribut angegeben wurden. Beispiel:
using System.ComponentModel.DataAnnotations;
public class Person
{
  [Required]
  [Editable(false)]
  [Display(Name = "ID", Description = "The id of the person.")]
 
[DisplayFormat(DataFormatString = "#{0}")]
  public int Id { get; set; }

  [Required]
  [StringLength(50)]
  [Display(Name = "Fullname",
    Description="The full name of the person.")]
  public string Name { get; set; } 
  …
}

Hierbei werden sowohl die Anzeigeattribute, als auch die Formatierungen und Validierungsregeln von TT.DataForm bei der Generierung berücksichtigt.

Lookup-Daten

Oft werden neben der primären Datenquelle zusätzliche Daten, zum Beispiel für ComboBoxen benötigt. Hierfür bietet TT.DataForm die Methode SetAssociationSource(), sowie die Eigenschaft SubDataSources. Mit Ihnen können mit der Hauptdatenquelle verknüpfte Datenquellen angegeben werden. Hierbei wird jeweils der Name der Eigenschaft in der Hauptdatenquelle, sowie die Liste der verknüpften Datenquelle angegeben.
Der folgende Code zeigt ein einfaches Beispiel:
var list = new ObservableCollection<Department>()
{
  new Department { Id = 1, Name = "Development" }
}
var persons = new ObservableCollection<Person>()
{
  new Person
  {
    Id = 1,
    Name = "Jörg Neumann",
    Department = departments[0]
  }
};
dataForm.DataSource = persons;
dataForm.SetAssociationSource("Department", departments);

Daraufhin erzeugt TT.DataForm für die Department-Eigenschaft eine Combobox und bindet diese an die angegebene Quelle.
SubDataSources_thumb2
Die Eigenschaft SubDataSources ist empfehlenswert, wenn die Quelle per Markup zugewiesen werden soll und die Anwendung dem MVVM-Pattern folgt. Hierbei muss als Quelle lediglich der Name der entsprechenden ViewModel-Eigenschaft angegeben werden, welche die verknüpfte Datenquelle zu Verfügung stellt.
ViewModel:
class PersonViewModel
{
public ObservableCollection<Person> Persons { get; }
public ObservableCollection<Departments> Departments { get; }
}

View:
<tt:DataForm DataSource = "{Binding Persons}">
  <tt:DataForm.SubDataSources>
  <tt:SubDataSource
    EntityPropertyName = "Department"
    DataSourcePropertyName = "Departments"/>
  <tt:DataForm.SubDataSources>
</tt:DataForm>

Im nächsten Post beschreibe ich, wie das Mapping zwischen Datenquelle und UI-Element beeinflusst werden kann.

Slides von der ice:2011

22.08.2011 05:37:00 | Lars Keller

Am Wochenende war mal wieder ice Zeit in Lingen. Die ice:2011 (Intelligent Communities for Europe) war mit 300 Teilnehmern ausverkauft und voll gepackt mit vielen Tracks für IT-Pros und Business Entscheider.

Es hat mal wieder richtig Spaß gemacht, viele aus der Community bei dem Event zu treffen, zu fachsimpeln und Ideen auszutauschen! Ich freue mich jetzt schon darauf, wenn es wieder heißt ice:2012!

Meine Slides & Code zu meiner Session “Pimp my Outlook - Tuning, Modding und - Hidden Features –“, könnt Ihr hier runterladen:

Download: Slides & Code

Just Released: Thinktecture DataForm

19.08.2011 09:43:00 | Jörg Neumann

Thinktecture DataForm ist ein Open Source Control für WPF (eine Silverlight-Version ist in Arbeit), das eine automatische Generierung von formularbasierten Oberflächen ermöglicht. Hierfür analysiert es die übergebene Datenquelle und die hiermit verknüpften Data Annotations. Darüber hinaus kann die Generierung durch ein umfangreiches Customizing-Modell gesteuert werden. Für eine bessere Usability werden kontextsensitive Symbole und Informationen zu den Daten angezeigt (Pflichtfeldmarkierungen, Beschreibungen, Eingabefehler, …). Darüber hinaus kann so gut wie jeder Aspekt der Oberfläche durch Styles und Templates angepasst bzw. ersetzt werden. Die Komponente unterstützt eine Vielzahl verschiedener Datenquellentypen, sowie programmatische und deklarative Validierung. Zudem kann die komplette Funktionalität über Commands gesteuert werden, was einen Einsatz in MVVM-Anwendungen erleichtert.
TTDataFormOverview
Die Einzelheiten der Komponente werde ich in nächster Zeit in separaten Posts beschreiben. Darüber hinaus gibt es auf der CodePlex-Site eine Dokumentation. Zudem ist ein Artikel in der dotnetpro in Planung.

TT.DataForm: Data Binding

18.08.2011 10:31:00 | Jörg Neumann

Nach der kurzen Einführung hier, gehe ich in den folgenden Posts näher auf die Features von TT.DataForm ein. Den Anfang mache ich mit dem Thema Data Binding.

Datenquellen

Eine Datenquelle bindet man an TT.DataForm über die Eigenschaft DataSource. Hierbei kann eine beliebige Datenquelle angegeben werden – unabhängig davon ob es sich um eine einzelnes Objekt oder eine Liste handelt. Die folgenden Datentypen werden hierbei unterstützt:
  • System.Object
  • System.Type
  • IEnumerable
  • ICollectionView
  • CollectionViewSource
  • ListCollectionView
Darüber hinaus kann TT.DataForm auch mit dem Data Source Windows von Visual Studio verknüpft werden, dass ein direktes Einfügen aus der Toolbox möglich ist.
DataSourceWindow

Metadaten

Die Generierung der Oberfläche erfolgt auf Grundlage von Metadaten, welche die Datenquelle in Form von Data Annotations bereit stellt. So werden zum Beispiel die Labels mit den Anzeigenamen belegt, die über das Display-Attribut angegeben wurden. Beispiel:
using System.ComponentModel.DataAnnotations;
public class Person
{
  [Required]
  [Editable(false)]
  [Display(Name = "ID", Description = "The id of the person.")]
  [DisplayFormat(DataFormatString = "#{0}")]
  public int Id { get; set; }

  [Required]
  [StringLength(50)]
  [Display(Name = "Fullname", 
           Description="The full name of the person.")]
  public string Name { get; set; }
  …
}

Hierbei werden sowohl die Anzeigeattribute, als auch die Formatierungen und Validierungsregeln von TT.DataForm bei der Generierung berücksichtigt.

Lookup-Daten

Oft werden neben der primären Datenquelle zusätzliche Daten, zum Beispiel für ComboBoxen benötigt. Hierfür bietet TT.DataForm die Methode SetAssociationSource(), sowie die Eigenschaft SubDataSources. Mit Ihnen können mit der Hauptdatenquelle verknüpfte Datenquellen angegeben werden. Hierbei wird jeweils der Name der Eigenschaft in der Hauptdatenquelle, sowie die Liste der verknüpften Datenquelle angegeben.
Der folgende Code zeigt ein einfaches Beispiel:
var list = new ObservableCollection<Department>()
{
  new Department { Id = 1, Name = "Development" }
}
var persons = new ObservableCollection<Person>()
{
  new Person
  {
    Id = 1,
    Name = "Jörg Neumann",
    Department = departments[0]
  }
};
dataForm.DataSource = persons;
dataForm.SetAssociationSource("Department", departments);

Daraufhin erzeugt TT.DataForm für die Department-Eigenschaft eine Combobox und bindet diese an die angegebene Quelle.
SubDataSources
Die Eigenschaft SubDataSources ist empfehlenswert, wenn die Quelle per Markup zugewiesen werden soll und die Anwendung dem MVVM-Pattern folgt. Hierbei muss als Quelle lediglich der Name der entsprechenden ViewModel-Eigenschaft angegeben werden, welche die verknüpfte Datenquelle zu Verfügung stellt.
ViewModel:
class PersonViewModel
{
  public ObservableCollection<Person> Persons { get; }
  public ObservableCollection<Departments> Departments { get; }
}

View:
<tt:DataForm DataSource = "{Binding Persons}">
  <tt:DataForm.SubDataSources>
    <tt:SubDataSource
      EntityPropertyName = "Department"
      DataSourcePropertyName = "Departments"/>
 
<tt:DataForm.SubDataSources>
</tt:DataForm>

Im nächsten Post beschreibe ich, wie das Mapping zwischen Datenquelle und UI-Element beeinflusst werden kann.

Treffen der .NET Developer Group Braunschweig - Visual Studio LightSwitch - Eine Einführung

17.08.2011 07:45:00 | Lars Keller

Die DNUG Braunschweig trifft sich am 30.08.2011 um 19:00 Uhr im Restaurant Zucker (Tagungsraum). Uns kommt der Microsoft MVP Constantin Klein mit einem Vortrag über LightSwitch besuchen.

Seit es mit den Visual Studio Express Editionen verschiedene kostenlose Einsteigervarianten der Microsoft IDE für die Entwicklung auf der Microsoft Plattform gibt, schien die Visual Studio Familie vollständig zu sein. Doch spätestens seit der öffentlichen Erstankündigung von Visual Studio LightSwitch am 04.08.2010 auf der VSLive! Konferenz wissen wir, dass weiterer Zuwachs zu erwarten ist. Nun fragt man sich: "Warum ist das notwendig?", "Was kann das?" oder "Wer braucht das?".

Diese Session soll einen Überblick über Zielgruppe und Möglichkeiten von Visual Studio LightSwitch geben und damit diese Fragen beantworten. Vielleicht lässt sich auch ein wenig die Sorge vieler Entwickler zerstreuen, dass ein solches Werkzeug mehr Ärger verursacht, als es hilft.

Speakerinfo:
Constantin arbeitet als Anwendungsarchitekt und Entwickler bei der Freudenberg Forschungsdienste KG. Dort beschäftigt er sich hauptsächlich mit dem Design und der Entwicklung von Web-Informationssystemen und Datenbanken. Seit seinem Studium der Wirtschaftsinformatik gilt sein besonderes Interesse darüber hinaus allen aktuellen Themen im Microsoft .NET Umfeld, insbesondere aber dem Thema Softwarearchitektur.

Er ist MCSD, MCITP Database Developer und MCPD Web + Enterprise Application Developer. 2010 und 2011 wurde er von Microsoft zum Most Valuable Professional (MVP) für SQL Server ernannt.

Er engagiert sich zusätzlich im Vorstand des Just Community e.V. (http://www.justcommunity.de) und als Leiter der .NET User Group Frankfurt (http://www.dotnet-ug-frankfurt.de).

Online Variante des Visual Studio Information Day

15.08.2011 17:26:27 | Christian Binder

Den Visual Studio Information Day gibt es nun schon seit der Visual Studio Version 2005. Der Fokus der Veranstaltung sind die Funktionen rund um Visual Studio Applikation Lifecycle Management, also von den Anforderungen zur Inbetriebnahme. Hierbei werden Themen wie Agile Development, Testing, Version Control, Team Build und Architektur Visualisierung und Validierung genauer beleuchtet. Ziel ist aber ganz klar einen Überblick für die Integrative Plattform zu vermitteln. Ich selbst finde ja, dass der Tag gut investierte Zeit ist, da es ja um den roten Faden auch viel Raum für Interaktivität gibt. Nun kann sich ja leider nicht jeder mal schnell einen Tag freischaufeln und zudem können wir mittlerweile auch nicht mehr alle Themen behandeln, da einfach zu viel Stoff vorhanden ist, so dass wir einige Themen Online zusammengestellt haben.

Für alle Interessierten, die keine Zeit für die Tagesveranstaltung haben oder Teilnehmer, die bestimmte behandelte Themen nochmal vertiefen möchten bzw. Themen die nur angesprochen wurden sich anzuschauen, empfiehlt sich ein Blick auf die Online Version des Visual Studio Information Day.

Artikel über TT.UIA in der dotnetpro

15.08.2011 16:52:00 | Jörg Neumann

In der aktuellen Ausgabe der dotnetpro (9/2011) ist mein Artikel “Aspektorientierte UI-Entwicklung mit Adornern” erschienen. Dies ist der erste Teil einer dreiteiligen Artikelserie in denen ich die technischen Aspekte von Thinktecture UIAnnotations erkläre.
Aus dem Abstract:
Benutzeroberflächen sind mehr als nur einfache Eingabemasken. Das drückt sich unter anderem darin aus, dass Nutzerfreundlichkeit und Interaktivität immer wichtiger werden. Bei der Implementierung stehen hingegen Kapselung und Wiederverwendbarkeit im Vordergrund. Adorner werden beiden Anforderungen gerecht.
dnp_092011

Webcast : Arbeiten mit Datenbank Projekten in Visual Studio 2010

12.08.2011 19:48:34 | Christian Binder

Eine Neuer Webcast ist zum Thema DB Development mit Visual Studio 2010 dank Bernhard Frank verfügbar:

Haben Sie sich schon mal gefragt was sich hinter der Projektvorlage "SQL Server 2008 Database Project" verbirgt und wie man damit arbeitet? Oder verspüren Sie den Wunsch die DB-Entwicklung nachvollziehbar zu machen, d.h. wie Sie es z.B mit einer Quellcodeverwaltung bei der klassischen Anwendungsentwicklung her kennen.

In diesen Webcast werden wir uns:
Den T-SQL Editor von Visual Studio 2010 mit Intellisense und Validierung anschauen. Refactoring betreiben und die Qualität unseres T-SQL Code mit der eingebauten Code Analyse steigern. Das Deployment (Einspielen) unseres DB-Projektes auf den DB Server und die generierten Update T-SQL Script ansehen. Anschließend eine Schema Änderung in unseren Projekt durchführen und das Projektschema mit einer Live-DB vergleichen (Schema Compare). Zum Abschluss noch einen Unit Test für unsere Stored Procedures schreiben und in die Tabellen noch Testdaten generieren lassen.

Hier schon zum Download, später dann auch auf dem Webcast Portal.

Viel Spass

Dotnet-kicks.de an die Windows 7 Taskleiste anpinnen

11.08.2011 22:30:00 | dotnet-kicks.de Blog

dnk_pin_120x240

Mit dem Internet Explorer 9 und Windows 7 ist es möglich, Webseiten an die Windows Taskleiste anzupinnen. Dadurch ist es möglich, seine Lieblingswebseiten zu öffnen, ohne den Browser vorher starten zu müssen.

Um eine Seite an die Taskleiste zu pinnen, braucht nur den Tab der Webseite mit der Maus auf die Taskleiste gezogen werden.

Ist die Webseite an die Taskleiste angepinnt, wird, wie bei Windows 7 gewohnt, eine so genannte Jumplist angezeigt, sobald mit der rechten Maustaste auf das Icon in der Taskleiste geklickt wird.

Mit wenigen Meta-Tags und einem kleinen JavaScript, welche in die Webseite eingebunden werden, kann diese Jumplist um einige interessante Features erweitert werden.


Da wir diese kleinen Erweiterungen bei dotnet-kicks.de eingebunden haben, stehen euch nun in der Jumplist die aktuellen Artikel von der Startseite sowie einige wichtige Einstiegspunkte von dotnet-kicks.de zur Verfügung, wie der folgende Screenshot zeigt:

dnk_Jumplist

Microsoft hat heute eine sehr schöne Übersicht Ins Netz gestellt, auf der alle Infos und Quellcodes zum Thema “Pinned-Sites” zu finden sind.

Vorträge meinerseits auf der BASTA! 2011 und prio.conference 2011

11.08.2011 08:14:16 | Gregor Biswanger

Im September und November stehe ich wieder als Wissensvermittler bei zwei großen Entwickler-Konferenzen auf der Bühne.

 

image

 

Die BASTA! wartet mit einem deutlich optimierten Programm und erweitertem Themenspektrum auf. Zahlreiche neue Formate machen die Konferenz noch interaktiver und erhöhen dadurch den Lern- und Networking-Effekt. Praxisbezogene Wissensvermittlung wird dabei ebenso groß geschrieben wie der Ausblick auf maßgebliche Technologietrends. Spannenden Sessions und zukunftsweisende Keynotes werden ergänzt durch Hands-on-Workshops und Diskussionspanels.

Weitere Informationen zu Anmeldung, Programm und Referenten unter http://basta.net

 

Das Testen von Windows Phone 7 Anwendungen

Zur Überprüfung von Silverlight-Anwendungen stellt Microsoft das Silverlight-UI-Test-Framework kostenfrei zur Verfügung. Der Vortrag zeigt, wie das Test-Framework für das Windows Phone 7 eingesetzt wird. Ein Praxisbeispiel veranschaulicht zusätzlich die Stärke des MVVM-Patterns.

(Mittwoch 28.09.2011 | 14:00 - 15:15 Uhr)

 

Einstieg in Expression Blend 4 für Entwickler

Expression Blend ist das Designwerkzeug für die Gestaltung von WPF und Silverlight-Oberflächen. Dieses umfangreiche Tool wurde explizit für Designer konzipiert, die getrennt von der Anwendungslogik die Oberfläche gestalten können. Jedoch sieht es in der Praxis oft anders aus. Viele Entwickler möchten eigenständig die Oberfläche frei gestalten. Dieser Vortrag gibt einen Einstieg in Expression Blend.

(Donnerstag 29.09.2011 | 10:15 - 11:30 Uhr)

 

 

image

 

Die 6. prio.conference findet vom 02. - 03. November 2011 in der Meistersingerhalle in Nürnberg statt. Das Thema der diesjährigen .NET-Konzeptkonferenz lautet „Cross Platform Development“. Ausgewählte Experten geben einen umfassenden Einblick in die Welt des Software-Engineering und zeigen anhand von Praxisbeispielen auf, wie man neue Technologien sinnvoll einsetzt und durch deren Kombination, Antworten für mehrere Plattformen findet.

Weitere Informationen zu Anmeldung, Programm und Referenten unter www.prioconference.de

 

Silverlight Everywhere - WP7 Apps für Web und Desktop

Microsoft veröffentlichte das neue Smartphone-Betriebssystem Windows Phone 7. Das Besondere daran ist, dass es komplett neue Konzepte mit sich bringt. Eines davon lautet, dass die Apps auf Silverlight aufbauen.  Dennoch basieren Windows Phone 7 Apps auf eine eigeneständige Silverlight-Runtime, die nicht der Web-Version entspricht. Dieser Vortrag zeigt anhand eines Praxisbeispiels, wie ohne großen Aufwand eine App für WP7, Web und Desktop entwickelt werden kann.

 

Verlosung der Trainings-DVD “WPF 4 und Silverlight 4”

 

9783827363404

Als Spezial werde ich bei jedem Vortrag eine Trainings-DVD zu “WPF 4 und Silverlight 4” Verlosen.

 

Ich freue mich jetzt schon auf die Konferenzen und die Teilnehmer.

ice:2011 & NRW Conf 2011 - Community Konferenzen–Ich bin dabei!

11.08.2011 03:26:00 | Lars Keller

Auch dieses Jahr finden wieder zwei große Community Konferenzen statt: ice:2011 und NRW Conf 2011

Ich freue mich wieder bei beiden Konferenzen als Sprecher dabei zu sein und die Leute für VSTO/OBA zu begeistern. :-)

Auf der ice:2011 (20.08.20111) halte ich eine Session über “Pimp my Outlook - Tuning, Modding und - Hidden Features –”. Die ice:2011 ist ausverkauft, vielleicht gibt es noch kurz vorher Tickets (?).

Bei der NRW Conf 2011 (09.09.2011) halte ich die Session “Microsoft Kinect & MS Office? – Neue Wege der Benutzer Experience (UX)?”. Es sind noch Plätze bei der NRW Conf 2011 frei.

Wir sehen uns da! :-)

Office 15 Entwicklung mit HTML5 und JavaScript?

11.08.2011 02:02:00 | Lars Keller

Vor ein paar Tagen geisterte ein Artikel durch Twitter, welcher zum Thema “Microsoft to focus on HTML5 and JavaScript for Office 15 extensions” hatte.

Wenn man die geleakten Office 15 Metro Screenshots im Netz anschaut, dann habe ich mir so etwas schon gedacht. Auf der einen Seite wäre es auch konsequent, wenn man sieht, was mit Windows 8 “kommen” soll. 

Ich hoffe ja sehr, dass mein geliebtes VSTO nun nicht durch HTML5 + JavaScript ersetzt wird, sondern dass dies nur eine weitere Möglichkeit ist, wie man Add-Ins in MS Office anzeigen kann. :-)

Es bleibt also spannend, vielleicht erfahren wir ja auch auf der kommenden Build Konferenz mehr. 

TFS NuGetter : Die NuGet Integration für den TFS

09.08.2011 19:25:18 | Christian Binder

Das Nugent Projekt hat das Ziel die Handhabung von Third Party Libraries bei der Entwicklung von .NET basierenden Applikationen zu vereinfachen. Hierbei kommen sogenannte Packages zum Einsatz. Ein Beispiel mit Video gibt es hier.

Der TFS NuGetter liefert nun die Integration für den TFS Team Build, so dass die Schritte nicht mehr manuell ausgeführt werden müssen, sondern als Teil des Builds.

Alle Details und den Download zum TFS NuGetter und dem Workflow findet man unter folgendem Link.

impuls SilverlightAutomationIDBehaviors veröffentlicht

09.08.2011 18:45:00 | Gregor Biswanger

Ein Problem beim Testen von Silverlight-Anwendungen mittels CodedUI ist, das Ermitteln einzelner TreeViewItems, ListBoxItems, ComboBoxItems oder DataGridCells. Dazu gibt es explizit das Property AutomationID. Die Items werden allerdings zur Laufzeit erzeugt und ein einfaches Data-Binding wird nicht übernommen. Als Lösung stellt Microsoft das Überschreiben von ToString der jeweiligen Entities vor (http://msdn.microsoft.com/de-de/library/gg413373.aspx). Das ist aber keine saubere Lösung für ein sauberes DomainModel.

Dazu habe ich ein paar Behaviors geschrieben (impuls SilverlightAutomationIDBehaviors) und sind ab heute bei der Expression Gallery veröffentlicht. Worin diese kostenfrei zum Download bereitstehen.

 

 

image

 

Hier ist eine Beschreibung für die Verwendung der Behaviors

 

1, Die Behaviors von der Expression Gallery downloaden (http://gallery.expression.microsoft.com/SLAutomationID*)

Die Assemblys aus der heruntergeladenen ZIP-Datei referenzieren.

* Rechtsklick auf ZIP-Datei und unter den Eigenschaften das „Zulassen“ nicht vergessen vor dem entpacken.

2, Anschließend muss das Silverlight-Projekt mit Microsoft Expression Blend 4 geöffnet werden.

3, In Expression Blend wird im Bereich „Behaviors“ die SilverlightAutomationIDBehaviors angeboten (siehe Abbildung 1).

Hier wird als Beispiel das SilverlightAutomationIDTreeViewBehavior (1) mittels Drag & Drop auf ein TreeView (2) gedropt. Das Behavior steht dann direkt als Kinderelement (3) vom TreeView. Auf der rechten Seite (4) sind dann alle dazugehörigen Eigenschaften.

SNAGHTML483d89a

Abbildung 1 – Das TreeView um das AutomationTreeViewBehavior erweitern.

Sobald die Silverlight-Anwendung geladen wird und das TreeView seine Daten erhält, vergibt das Behavior automatisch die AutomationIDs für die TreeViewItems. Diese sind als Standard der Index des jeweiligen TreeViewItems.

image

Abbildung 2 – Die TreeViewItems erhalten als Standard deren Indexnummer als AutomationID und Namen.

Das Behavior kann auch ohne Expression Blend zum Einsatz kommen. Der passende XAML-Code würde wie folgt aussehen:

 

   1:  <sdk:TreeView x:Name="treeViewUsers" ItemsSource="{Binding Users}">
   2:      <sdk:TreeView.ItemTemplate>
   3:          <sdk:HierarchicalDataTemplate ItemsSource="{Binding Friends, Mode=TwoWay}">
   4:              <TextBlock Text="{Binding Name, Mode=TwoWay}" VerticalAlignment="Center" HorizontalAlignment="Stretch" />
   5:          </sdk:HierarchicalDataTemplate>
   6:      </sdk:TreeView.ItemTemplate>
   7:   
   8:    <i:Interaction.Behaviors>
   9:      <SetAutomationIdBehavior:AutomationTreeViewBehavior />
  10:    </i:Interaction.Behaviors>
  11:  </sdk:TreeView>

Listing 6 – Asynchronen Prozess mittels Rx regeln

 

SNAGHTML14deaaec

Abbildung 5 –  Das richtige Ergebnis durch das Abwarten von Prozess 2 mittels ToAsync

 

Fazit

Bei den Beispielen sieht man nicht unbedingt weniger Zeilen Code, jedoch umso umfangreicher das Projekt wird, desto mehr spürt man den Vorteil. Für die Datensynchronisierung kann auch eine eigenständige Methode ausgelagert werden. So läuft man nicht in Gefahr, dass eine Abhängigkeit öffentlich gehalten werden muss. Sehr Toll an Rx ist zudem, dass man mittels LINQ auch erst definieren kann, ab wann wirklich der Thread dann gestartet werden darf. Ist der Zustand erfüllt, dann wird Subscript.

 

Mein Tipp! Kostenloses Video-Training „Einführung in Reactive Extensions“.

MakerBot: Fertig! :-)

08.08.2011 00:09:00 | Daniel Springwald

Wow das ging verhältnismäßig fix: Statt vielen Tagen beim Rapman ist der Makerbot nach nur 14 Stunden zusammen gebaut und funktioniert! :-)))


Hier sieht man den zusammen gebauten Extruder für das heiße ABS Plastik.


Ein wenig Elektronik ist auch notwendig - hier noch mit moderat vielen Kabeln. Später sieht das schon ziemlich wild aus mit allen Kabeln an ihrem Platz


Und fertig - so sieht er von vorn aus...


...und so von der Seite.

Jetzt beginnt also die spannende Zeit der Kalibrierung in welcher die Maschine und das ABS-Material so auf einander justiert werden, dass das Druckergebnis optimal wird. Bin schon auf das Ergebnis gespannt!

Makerbot: Automatische, beheizbare Build-Plattform

05.08.2011 18:00:00 | Daniel Springwald

Als erstes wird die Build-Plattform zusammen gebaut. Bereits hier merke ich, daß der Bausatz im Gegensatz zum Rapman viel einfacher und schneller zusammen gebaut werden kann.

Statt eine Ebene aus zahlreichen Stangen, Schrauben und Acrylplatten zu erstellen, ist sie beim Makerbot bereits fertig aus einem Stück Holz gelasert. Die Teile müssen nur noch ineinander gesteckt und verschraubt werden.

Hier ist die Build-Plattform auch schon fast fertig - inklusive "Sitzheizung", Fließband für automatische Serienproduktion und Keilriemen für X-Achsen Transport.

Nach knapp 2 Stunden ist die Plattform dann auch schon fertig ;o)

.NET-Architektur mit „GoFish“ – Vision, Diagnose und Analyse

05.08.2011 12:44:15 | Gregor Biswanger

gofish-1

In meiner Familie ist derzeit ein hohes Interesse am Erlenen von C# aufgetaucht. Noch interessanter sind die Übungsaufgaben der heutigen Lehrliteratur. Die Ziele sind jeweils kleine Spiele zu programmieren, die das Lernen durch einen hohen Spaßfaktor versüßt. Dabei fand ich folgendes Spiel sehr amüsant: „GoFish“.

Bei Lehrbüchern wird oft nur vorgegeben, wie es zum Lösungsweg kommen soll. Dabei stehen oft unfertige Klassen und Funktionen als Starthilfe bereit. Ich nahm mir das Beispiel „GoFish“ und entwarf daraus ein komplett neues Vorzeigeprojekt. Das Vorzeigeprojekt sollte vom Umfang her nicht gleich explodieren und gerade für den Einstieg in die Architektur, Vorgehensweisen und Technologien bieten.

Das Thema Softwarearchitektur ist sehr Umfangreich, so dass diese Architektur-Serie nur recht Oberflächlich auf die meinerseits vorgegangene Vorgehensweise zu diesem Beispiel eingehen wird. Dabei werden wir gemeinsam die sechs Phasen der Entwicklung durchgehen:

image

 

Die Serie selbst wird folgende Technologien und Vorgehensweisen aufzeigen:

Visual Studio 2010 Ultimate - Architecture Tools (Use Cases, Activity Diagram, UML, Layer Diagram, Component Diagram), Skeching, Prototyping, Domain-Driven Design (DDD), Model-Driven Architecture (MDA), Test-Driven Development, Workflow-Foundation 4 (WF4), Aspektorientierte Programmierung (AOP), Reactive Extensions (Rx), Model-View-ViewModel (MVVM), WPF, Silverlight, ASP.NET MVC 3 und vieles mehr.

Ich wünsche Euch viel Spaß und bin für jede Diskussion offen!

 

Die Vision

image

Von der Idee zur Vision. So beginnt es mit jedem Softwareprojekt. In der Regel hat der Kunde eine Vision, nämlich eine Softwarelösung für sein Anliegen zu erhalten. Bei diesem Beispiel kommt die Vision eher von einem Lehrbuch. Somit also auch die Spezifikation. Dieses gibt vor ein Kartenspiel namens „GoFish“ zu programmieren. Dabei gibt es folgende Spielregeln (funktionale Anforderungen):

 

  • Das Spiel beginnt mit einem Satz aus 52 Karten. Jeder Spieler erhält fünf Karten. Die Spieler fragen einander abwechselnd nach einem Wert (Zum Beispiel: „Hat einer ein Ass?“. Hat ein anderer Spieler Karten mit diesem Wert, muss er sie abtreten. Hat kein anderer Spieler eine Karte mit diesem Wert, muss der Spieler „Fischen gehen“, indem er eine Karte aus dem Stapel nimmt.
  • Das Ziel des Spieles ist es, Quartette zu sammeln. Ein Quartett ist ein vollständiger Satz aller vier Karten mit dem gleichen Wert. Der Spieler, der am Ende des Spieles die meisten Quartette hat, ist der Gewinner. Sobald ein Spieler ein Quartett zusammen hat, legt er es offen auf den Tisch, damit jeder sehen kann, wer welche Quartette hat.
  • Bei dieser Computerversion von GoFish Gibt es zwei Computerspieler und einen normalen Spieler. Jede Runde beginnt damit, dass der Spieler unter seinen angezeigten Handkarten eine aussucht. Das macht er, indem er eine der Karten auswählt und anzeigt, dass er danach fragen wird. Dann fragen die beiden Computerspieler nach ihren Karten. Das Ergebnis der einzelnen Runden wird angezeigt. Das wird wiederholt, bis es einen Sieger gibt.
  • Das Spiel kümmert sich automatisch um den Austausch der Karten und das Ablegen der Quartette. Gibt es einen Sieger, ist das Spiel vorüber. Dann zeigt das Spiel den Namen des Siegers an (oder der Sieger, falls es unentschieden ausgeht). Es kann nichts mehr gemacht werden – der Spieler muss das Programm neu starten, um ein neues Spiel zu beginnen.

 

Somit sind schon die wichtigsten Informationen vorhanden. Bei einem realen Projekt, sieht es oft ganz anders aus. Es sind vonseiten des Kunden nur Ideen vorhanden, worauf noch lange nicht alle Anforderungen bewusst/bekannt sind. Dann kommt noch ein weiteres Problem. Die Kommunikation. Der Kunde ist Business-Experte in seinem Arbeitsbereich und der Entwickler ist Business-Experte beim Programmieren von Software. Dabei möchte der Kunde nicht erst erlenen wie man Software schreibt und wir Entwickler wollen nicht das Fach vom Kunden studieren.

 

Eine „Common-Language“ aufbauen

Für dieses Problem gibt es nur eine Lösung. Man muss eine „Common Language“ aufbauen. Wenn man sich die Grafik in Abbildung 1 etwas genauer ansieht. Stellt man fest, dass es einen Treffpunkt beider Welten gibt. Genau bei diesem Treffpunkt können wir miteinander eine gemeinsame Sprache sprechen, mittels Software auf dem Bildschirm.

 

Abbildung 1 – Die Common Language

 

Mein Tipp! Das Video-Tutorial "Wie Projekte richtig starten?" 

 

Die Diagnose

image

Wir kommen ab hier zur Diagnose-Phase. Anforderungsanalyse und -spezifikation (engl. Requirement analysis and specification)

  • Die Diagnostic Phase beginnt bereits während des Verkaufsvorgangs und endet mit der Angebotsannahme für das Implementierungsprojekt.
  • Ziel der Diagnostic Phase ist es, ausreichend Informationen zusammenzutragen, um den Projektumfang auf höchster Ebene zu definieren und ein aussagekräftiges Angebot für die nächste Phase zu erstellen.
  • Die wichtigsten Zielvorgaben in dieser Phase sind das Implementierungsangebot und der Projektplan.

 

Sketches

Zum Aufbau der “Common Language” eignet sich geradezu ideal, das Sketching. Mittels Sketching kann blitzschnell vorgezeigt werden, welches Bild man aus den Anforderungen gewonnen hat. Dabei kann der Kunde sehr schnell ein Ergebnis sehen und das Bild in die richtige Richtung lenken. Dabei behilft das Sketching weiterhin bei der Anforderungsanalyse. Vergessene Anforderungen werden jetzt ersichtlicher. Zusätzliche Ideen bauen sich schneller auf.

Vorteile durch Sketching:

  • Common Language wird aufgebaut
  • Schnelles Ergebnis
  • Schnell und leicht änderbar
  • Behilft bei der Anforderungsanalyse

 

Als Sketching Tool empfehle ich Balsamiq Mockups. Hier können sehr schnell Sketches zu Anwendungen zusammengestellt werden. Sehr wichtig ist, dass die Sketches wie gezeichnet aussehen. Somit wird garantiert, dass wirklich nur über die Anforderungen und nicht über das Design gesprochen wird. Ich bin bei Projekten oft selbst darauf reingefallen, indem ich über die Farben gesprochen hatte, obwohl es nur Sketches für die Anforderungsanalyse waren.

 

SNAGHTMLaf7a52d

Abbildung 2 – Balsamiq Mockups – Tool zum Erstellen von Sketches

 

Für GoFish fertigte ich erst Sketches in Balsamiq Mockups an. Obwohl diese eigentlich bereits durch das Buch vorgegeben wurden. Dennoch machte ich dies für diesen Blog-Post.

 

image

Abbildung 3 – Der Sketch zu “GoFish”

 

Zusätzlich sollte für ein Softwareprojekt, ein Portal wie SharePoint angelegt werden. Hierbei lässt sich die „Common Language“ durch ein Glossar für Fremdwörter einfach erweitern. Auch das Verwenden von Brainstorming mittels Mind-Maps, lässt noch einiges an Ideen auftauchen.

Mein Tipp! Die SharePoint Lösung Project4Sure – Hier werden alle Phasen durch SharePoint begleitet und können hervorragend gemanagt werden. http://www.project4sure.com

Die Brainstorming-App für Windows Phone 7. Windows Phone 7 App – Brainstorming

Das Video-Tutorial “Sketches mit Balsamiq Mockup

 

Die Analyse

image

Wir kommen ab hier zur Analyse-Phase. Systemdesign und -spezifikation (engl. System design and specification)

  • Ziel der Analysis Phase ist es, alle in der Diagnostic Phase erkannten Anforderungen genau zu spezifizieren und die erforderlichen Geschäftsprozesse zu modellieren. Die Beschreibung der Anforderungen und Prozesse erfolgt produktneutral.
  • Die wichtigsten Zielvorgaben in dieser Phase sind die Erstellung der Functional Requirement Dokumente FRDs und der Dokumentation der Geschäftsanforderungen in den Business Process Dokumenten bzw. in einem externen Prozessmodellierungstool.

 

Modellieren

Use Case

Ich beginne mit dem Entwerfen von Anwendungsfällen (Use Cases - UML). Um eine Systemanalyse zu führen. Hierbei lässt sich sehr schnell Diagnostizieren, welche Abhängigkeiten von anderen Systemen gegeben sind. Auch ein Ziel ist es, möglichst einfach zu zeigen, was man mit dem zu bauenden Softwaresystem machen will. Welche Fälle es in der Anwendung also gibt.

Dazu habe ich in Visual Studio 2010 Ultimate die Architecture-Features verwendet und ein Use Case Diagramm erzeugt.

 

image

Abbildung 4 – Das Use Case Diagramm für „GoFish“

Das Domänen-Modell

Anschließend modellierte ich nach Domain-Driven Design (kurz DDD) von Eric Evans, ein Domänen-Modell (DomainModel). Hier geht es auch darum eine allgemeine Sprache aufzubauen. Die allgemeine Sprache baut sich aufgrund des Softwaredesigns auf, die sich nach dem Umfeld (Domäne) der Anforderungen ergibt. Dabei soll zum Beispiel mittels einfachen UML ein Schema entworfen werden, das anschließend den Code dazu generieren kann. Bei DDD wird zu Beginn auch kein Datenbankschema entworfen, sondern der Fokus bleibt bei einem Klassenmodell. Somit lassen sich komplexe Vorgänge einfacher implementieren. Weil hierbei die Abhängigkeit zum Datenbankschema genommen wird.

Als Tool verwendete ich die Visual Studio 2010 Ultimate-Version mit den Architecture-Features. Worin ich das Standard UML verwendete.

image

Abbildung 5 – Das DomainModel von „GoFish“

Dabei beschreibt das DomainModel folgendes:

  • Wir haben einen Spieltisch mit keiner oder mehreren Karten (Kartenstapel). Der Spieltisch hat auch noch mehrere Spieler.
  • Wir haben einen Spieler mit keinen oder mehreren Spielkarten. Der Spieler kann zudem ein Quartett haben oder mehrere.
  • Die Spielkarte kann auf dem Spieltisch oder dem Spieler öfter vorhanden sein, oder auch nicht.

 

Der Spieltisch (GamblingTable), Die Spielkarte (Card) und der Spieler (Player) sind jeweils Entitäten (Entities bzw. Reference Objects). Denn diese Gegenstände bleiben ein und dasselbe, auch wenn sich die Eigenschaften dazu ändern sollten. Entitäten werden oft mit Hilfe von eindeutigen Identifikatoren modelliert.

Bei „GoFish“ hatte ich die ID für den Spieltisch ausgelassen. Denn dieser Tisch soll nur einmalig existieren.

Die Farbe (ColorType) und der Wert (ValueType) der Spielkarte, bezeichnet man als Wertobjekte (Value Objects).

 

Mein Tipp! Das Buch von Eric Evans Domain-Driven Design: Tackling Complexity in the Heart of Software

Keeping Architectures Relevant: Using Domain-Driven Design and Emergent Architecture to Manage Complexity and Enable Change

 

Die Aktivitätsdiagramme (Activity Diagram)

Der nächste Schritt, war das definieren der einzelnen Prozesse. Dafür eigenen sich Aktivitätsdiagrammegeradezu ideal. Das Aktivitätsdiagramm ist ein Verhaltensdiagramm. Worin einzelne Aktionen grafisch miteinander verbunden werden. Auch dieses UML-Diagram ist in den Architecture Tools von Visual Studio 2010 Ultimate enthalten. Damit legte ich auch erst den Spielstart als einzelnen Prozess fest.

GameSetUpActivityDiagram

Abbildung 6 – Der Spielstart als Aktivitätsdiagramm

 

Die Architektur von Spielen ist auf so genannte Game Loops gelegt. Hierbei soll bei jeder Iteration das Spiel durch Zustände geregelt werden. Eher baut sich diese Strategie auf das zusätzliche Rendern (Zeichnen) bei einem Intervall auf, das bei 3D Spielen zum Einsatz kommt. jedoch konnte ich für GoFish auch eine Iteration wiederfinden. Somit entwarf ich den Prozess, beginnend mit der Aktion „Auswahl einer Spielkarte“ als Aktivitätsdiagramm, das nun als die Game Loop fungieren soll.

 

GameCoreActivityDiagram

Abbildung 7 – Die Game Loop von GoFish als Aktivitätsdiagramm

 

Prototyping mit SketchFlow

image

Wenn die Prozesse definiert wurden, können die Sketches interaktiv miteinander als SketchFlow verknüpft werden. So das diese als Prototype fungieren können. Der Vorteil liegt darin, dass nun die Vision vom Kunden „spürbar“ wird. Ab diesen Zeitpunkt kann man sich verstärkt mit den Thema Usability auseinandersetzen. Mittels SketchFlow verwendete ich bereits bei Kundenprojekten ein Eye-Tracking-System, um korrekt ermitteln zu können, dass die angewandte User Experience die richtige Zielgruppe von Anwendern trifft.

Als Tool eignet sich Microsoft Expression Blend 4 Ultimate mit SketchFlow. Expression Blend ist vorwiegend für Designer konzeptioniert worden, die damit für WPF und Silverlight, die Oberflächen gestalten können. SketchFlow ist eine Erweiterung die nur im Ultimate-Paket enthalten ist. Damit lassen sich WPF und Silverlight-Prototypen erstellen, die mittels SketchFlow-Player beim Kunden interaktiv verwendet werden können. Das Besondere am SketchFlow-Player ist die integrierte Feedback-Funktion. Worin der Kunde auf der Oberfläche selbst zeichnen und Feedback geben kann. Eine SharePoint Erweiterung bietet zusätzlich eine klassische Dokumentenverwaltung der Feedbacks an.

Vorteile durch einen SketchFlow:

  • Zusammenhänge werden verständlicher
  • Die Common Language wird erweitert
  • Benutzbarkeit (Usability) kann getestet werden
  • Behilft weiterhin bei der Anforderungsanalyse

 

Bei Expression Blend SketchFlow können die Sketches von Balsamiq Mockup weiterhin verwendet werden, indem man diese als Bilder importiert. Um Steuerelemente interaktiv einzubinden, muss das Sketch-Bild auf die letzte Hintergrund-Ebene. Somit können die Steuerelemente einfach über das Bild gelegt werden.

ExpressionBlendSketchFlow

Abbildung 9 – GoFish als SketchFlow-Prototype mit Expression Blend 4

 

Normal hätte ich auch den SketchFlow-Prototypen nicht unbedingt machen müssen. Denn im Buch wurde bereits eine Sketch-Vorlage gegeben und es gibt auch keinen Kunden dazu.

SketchFlowPlayer

Abbildung 10 – GoFish als SketchFlow-Prototype im SketchFlow-Player mit Feedback

Mein Tipp: Das Video-Tutorial zu “Prototypen mit SketchFlow

 

Zusammenfassung und Vorschau auf den nächsten Teil

Wir haben nun gemeinsam an den Phasen der Vision, Diagnose und der Analyse geschnuppert. Dabei wurde auf das Thema Kommunikation eingegangen und das diese durch Metaphorik vereinheitlicht wird. Es beginnt mit Sketching, Modellierung und endet mit Prototyping. Bei richtigen Kunden-Projekten kommen natürlich noch zusätzliche Dokumentationsverfahren zum Einsatz. Die vom Umfang zu groß wären, um diese hier ausführlich behandeln zu können. Auch unterscheidet sich die Vorgehensweise durch den Entwicklungsprozess. Zum Beispiel Agile-Prozesse wie SCRUM oder XP. Dieser Artikel soll eben nur zum allgemeinen Einstieg behelfen und meine Vorgehensweise bei der Lösung der Aufgabe „GoFish“.

Beim nächsten Teil werden wir die Phase Design und Development genauestens ansehen. Es beginnt mit der Abstraktion der Anforderungen, bis hin zur Entwicklung mit Test-Driven Development (TDD).

Viel Spaß und bis zu der nächsten Folge, wenn Ihr mögt!

MVC-Views kompilieren

05.08.2011 10:46:00 | Martin Hey

Im Standard werden MVC-Views beim ersten Zugriff kompiliert. Das hat einen großen Nachteil: Man erfährt erst beim Navigieren zu der View im Browser (oder bei der Ausführung der Coded UI Tests), dass ein Kompilierungsfehler vorliegt. Besonders bei größeren Änderungen an der Domäne wäre es aber schon sinnvoll, schon während des Continous Integration Builds zu wissen, wo noch Probleme vorliegen.

Die Einstellung ist ganz einfach. In der *.csproj-Datei des Web-Projektes gibt es eine Eigenschaft MvcBuildViews, die man lediglich auf true setzen muss.

<MvcBuildViews>true</MvcBuildViews>

Wenn man möchte, kann man diese Einstellung auch noch abhängig von der Build-Konfiguration setzen - also z.B. nur bei Release-Builds. Wer genau wissen möchte, wie man dazu vorgeht, dem empfehle ich die Blogposts von Malcolm Sheridan, der das allgemeine Vorgehen beschreibt und K. Scott Allan, der noch auf einige Besonderheiten (z.B. bei der Verwendung des Entity Frameworks) hinweist.

Makerbot ist da

04.08.2011 19:00:00 | Daniel Springwald

Nach 6 Wochen Warten ist nun endlich das Makerbot-Paket mit dem Thing-O-Matic Bausatz eingetroffen.

Ich setze große Hoffnungen in den Makerbot und bin schon sehr gespannt, wie das Zusammenbauen klappt. Beim Rapman hat das zwar viel Spaß gemacht, war aber auch *sehr* aufwändig und hat viele Tage gekostet.

Auf den ersten Blick sehen Einzelteile recht übersichtlich aus - aber das täuscht: In den kleinen Kartons stecken Dutzende Einzelbauteile und hunderte Schrauben und Muttern.

Zur Sache: HTML5 Die Serie: Folge 2 - Webseiten in HTML5 erstellen

04.08.2011 18:00:14 | Kay Giza

Aufmerksame Leser meines Blogs wissen, mit HAHTEEMLFÜNF aka HTML5, ist es gar nicht so einfach. Was Katzen, umfallende Bäume und die Steuererklärung mit HTML5 zu tun haben wissen wir seit dem Teil 1 der 'HTML5 - Die Serie'. Mein Kollege Kai Jäger hat in Folge 2 nicht nur sich selbst übertroffen, sondern wird gemeinsam mit Ihnen eine HTML5-Webseite erstellen, erklären was es mit einem Doctype auf sich hat und warum der Quirksmode zwar lustig klingt, man sich aber am besten von ihm fern hält. Am Ende des Videos werden Sie nicht nur stolz sein... [... mehr Informationen und das Videos finden Sie in diesem Blogeintrag auf Giza-Blog.de]

This post is powered by www.Giza-Blog.de | Giza-Blog.de: RSS Feed
© Copyright 2006-2011 Kay Giza. All rights reserved. Legal
Subscribe

Version Control Improvements in TFS 11

02.08.2011 23:20:30 | Christian Binder

Eine der Neuerungen mit TFS 11 im Bereich Version Control werden die Local Workspaces sein. Mit Local Workspaces wollen wir unter anderem folgende Punkte verbessern:

1) Um mit TFS zu arbeiten, muss man das Konzept Workspaces verstanden haben. Mit Local Workspaces wird der Einstieg intuitiver.

2) Die Read-only Files verwirren mich vor allem, wenn ich mit Werkzeugen arbeite, die über keine Version Control Integration verfügen.

3) Ich möchte eine verbesserte Offline Funktionalität und Performance haben.

Mehr Hintergrundinformationen gibts hier auf Brian’s Blog.

Regeln | Impressum