BusyIndicator in ObservableCollection einbinden

In meiner aktuellen Silverlight Schulung haben wir ein wenig auf Performance geschaut. Ein Ladevorgang einer sehr langen Liste dauert etwas länger und während dieser Zeit soll der eine Wartemeldung angezeigt werden. Im Silverlight Toolkit befindet sich auch passend ein entsprechendes Control der BusyIndicator. Dieser lässt sich auch in sein Template zerlegen und optisch anpassen. Während der Busyindicator läuft kann der User keine UI Elemente nutzen und so z.B. einen Button eben nicht zwei mal drücken. Die entscheidende Frage ist, wie zeige ich den BusyIndicator nun an. Zunächst hat dieser eine Boolsche Eigenschaft IsBusys die man setzen kann. Manchmal läuft die Logik aber in einer Komponente dahinter von der man keinen Zugriff aufs UI hat.  In meinem Fall eben eine Liste die von ObservableCollection erbt. Diese Liste wird zur Laufzeit durch einen länger laufenden Download gefüllt, zur Design Zeit mit Dummy Daten.  Diese Entscheidung wird duchr HTMLPagel.Isenabled getroffen. Die Observeable Collection muss ich nehmen damit das gebundene UI Element ( z.B. Datagrid oder Listbox) automatisch und asynchron die Daten auch anzeigen sobald sie fertig geladen sind. Zusätzlich verpasse ich der personen Liste ein Property isBusy. Dieses wird gesetzt wenn der Download startet. In der OpenreadCompleted Methode wird dann der Wert wieder auf false gesetzt. Public Class personen Inherits ObservableCollection(Of person) Public Sub New() If HtmlPage.IsEnabled Then Dim wc As New WebClient AddHandler wc.OpenReadCompleted, AddressOf fertig IsBusy = True wc.OpenReadAsync(New Uri("namen.txt", UriKind.Relative)) Else Add(New person With {.alter = 27, .Firma = "ppedv ag", .Name = "Hannes"}) Add(New person With {.alter = 32, .Firma = "ppedv ag", .Name = "Andreas"}) Add(New person With {.alter = 23, .Firma = "ppedv ag", .Name = "Bernhard"}) Add(New person With {.alter = 45, .Firma = "ppedv ag", .Name = "Stefan"}) Add(New person With {.alter = 12, .Firma = "ppedv ag", .Name = "Arnold"}) End If End Sub Private _IsBusy As Boolean Public Property IsBusy() As Boolean Get Return _IsBusy End Get Set(ByVal value As Boolean) _IsBusy = value OnPropertyChanged(New PropertyChangedEventArgs("IsBusy")) End Set End Property Im XAML wird dann der BusyIndicator an die IsBusy Eigenschaft gebunden. Dies ist auch der Grund für die onpropertyChanged Codezeile im vorigen Beispiel. Damit kann das UI Änderung der Daten im Personen Object “abbonieren”. Damit wird die Anzeige eben sofort erneuert. <toolkit:BusyIndicator Height="100" HorizontalAlignment="Left" Name="BusyIndicator1" IsBusy="{Binding IsBusy}" VerticalAlignment="Top" Width="150" > </toolkit:BusyIndicator>

Eingabe Validierung in WCF RIA Services

Wenn man beim erstellen eines Domainservices die Metadaten dazu erstellt, kann man sehr einfach per die Eigenschaften des Geschäftsobjekte deklarativ im Code mit Informationen versehen, die später zur Laufzeit ausgewertet werden. Also per <Attribut> Syntax.   Dadurch erhält man dann im Web Projekt Klassen in der Konvention DomainService1.metadata.vb. Im Code dieser Klasse kann dann per Annotation  die Logik jeder Eigenschaft gesteuert werden. Folgendes lässt in einem Dataform das Feld Telefon erscheinen und es wird Fett dargestellt, da es ein muss Feld ist. Darüber erscheint es ziemlich weit oben. <Required()> <Display(Name:="Telefon", Order:=2)> Public Property Phone As String Was passiert nun wen Benutzer keine Telefonnummer angibt und das Feld leer lässt?   Natürlich kann man auch den Fehlertext noch ändern. Dazu einfach im Required ErrorMessage:= setzen. Diese Prüfung der Benutzereingabe findet Adhoc, also nach verlassen des Eingabefeldes statt. Ohne Interaktion zum Server. Für komplexere Validierungen stellt Silverlight ein Benutzerdefinierte Prüfung sowohl am Client als auch am  Server bereit. Dazu wird das entsprechende Property in der IRA DomainKlasse per Attribut Customvalidatiion dekoriert. Der erste Parameter stellt den Klassennamen dar und der zweite die Methode. <CustomValidation(GetType(regeln), "hannesValid")> Der Prüfcode muss eine gewissen Regelwerk folgen, sonst wird er schlicht nicht ausgeführt. Zunächst muss die Prüfroutine shared (c# static) sein. Die Rückgabe muss vom Typ Validationresult sein. Imports System.ComponentModel.DataAnnotations Public Class regeln Public Shared Function hannesValid(ByVal region As String) As ValidationResult If region.Length > 2 Then Return New ValidationResult("nur 2 Zeichen") End If Return ValidationResult.Success End Function End Class Das wird nun eine reine Prüfung am Server bewirken. Also erst wenn der Datensatz nach einer Änderung zurück geschrieben wird. Mit Hilfe von Shared Code kann diese Prüfung aber auch am Client sofort durchgeführt werden. Zeitpunkt ist wenn die Datenbindung aktualisiert wird, also bei LostFocus. Die Prüfungsklasse muss nun in der Web Anwendung in einer eigenen Datei erstellt werden die der Namens Konvention shared.vb oder shared.cs folgt. Der Code wird dann automatisch von Visual Studio 2010 auch in die Silverlight Anwendung “repliziert”. In meinem Beispiel validiert laut debugger zwar die Silverlight Anwendung aber der Benutzer sieht keine Fehlermeldung. Das muss man erst über einen optionalen Parameter im ValidationResult ansteuern. Dabei wird der Feldname als Parameter angegeben, hier eben Region. Public Shared Function hannesValid(ByVal region As String) As ValidationResult If region.Length > 2 Then Return New ValidationResult("nur 2 Zeichen", New String() {"Region"}) Denkbar ist auch, da als Array vorhanden, mehrere Felder anzugeben in der Form New String() {"Region", "Phone"}) Sinnvoller ist meines Erachtens einen universellen Silverlight Fehlerchecker zu haben. Dazu wird der Context des auslösenden Controls mitgebeben. Public Class regeln Public Shared Function hannesValid(ByVal region As String, ByVal ctx As ValidationContext) As ValidationResult If region.Length > 2 Then Return New ValidationResult("nur 2 Zeichen", New String() {ctx.MemberName}) Das alles und viel mehr lernt man in meine Silverlight Schulungen bei ppedv.

Insert mit den WCF RIA Services schlgt fehl

to update the EntitySet 'QOSeeeLog' because it has a DefiningQuery and no <InsertFunction> element exists in the <ModificationFunctionMapping> element to support the current operation. Wenn man der Ursprungstabelle einen Primary Key verpasst dann klappst auch mit dem Entity Framework Insert. Dann das Modell in Visual Studio refreshen und alles sollte funktionieren.

Visual Studio 2010 RC Bugs

ich habe zwei Bugs, für die ich auch den passenden Workaround anbieten kann. 1) Visual Studio Crash bei Intellisense Aufruf In meinem Fall passiert das, wenn man bei fehlerhaften Code, der rot unterwellt ist, auf das kleine rote Rechteck mit der Maus fährt. Schneller kann man Visual Studio 2010 nicht beenden. Dies passiert laut Microsoft nur auf Tablet und Touch Systemen. Der von Microsoft angebotene Patch hilft bei mir nicht. Geholfen hat das Stoppen von zwei Services (TabletInputService und TabletServicePen) und Neustart von VS. 2) Visual Studio installer kommt beim Start von Office Programmen In meinem Fall kommt jedesmal beim starten von Outlook der Installer Dialog (please wait while windows configures visual studio 2010) für sagenhafte 10 Minuten hoch. Andere User beschreiben das Verhalten auch für Word oder Excel. Geholfen hat das Erzeugen eines leeren Verzeichnisse mit dem Namen C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\FromGac

VSone 2010 meine Sessions und Workshop

Obwohl Visual Studio 2010 ein wenig später kommt, ist im Februar in München auf der VSone der richtige Zeitpunkt sich zu dem Thema ausführlich auszutauschen. Für mich als Web Guy, gibt es im ASP.NET Bereich, endlich mal wieder was richtig Neues. Ich werde nicht über ASP.NET MVC sprechen das macht jemand wesentlich kompetenterer, Scott Hanselman von Microsoft. ASP.NET Performance Boost In dieser Session werde ich über optimierungen vom Datenbank Server, über die Web Anwendung bis hin zum HMTL Code aus dem Nähkästchen plaudern. Ich behaupte mal frei erfunden das 90 % aller ASP.NET Anwendungen mit minimalen Aufwand mindestens doppelt so schnell sein könnten. Das bedeutet, das ein Web Server 100% mehr Request pro Sekunde bearbeiten kann. Das ist ja schon mal was. In vielen meiner Projekte ergaben sich sogar Ersparniswerte von über 90%. Silverlight 4 Silverlight ist meiner Ansicht nach die wichtigste Technologie von Microsoft, nach ASP.NET. Trotzdem haben noch nicht viele .NET Developer damit wirklich gearbeitet. Mein Ziel für diese Session ist, einen Überblick zu bieten. Also auch für Entwickler die kaum Ahnung von Silverlight haben. Ein Rundflug rund um die Technologie basierend auf der Version 4. Wer also schon seit Jahren mit SL 3 entwickelt wird deshalb auch viel Bekanntes hören. Umstieg von ASP.NET 2 auf ASP.NET 4 Ich mache auch jedes Jahr einen Workshop auf der VSone. Dieses Jahr möchte ich ASP.NET Experten ansprechen, die in der Regel am Stand von ASP.NET 2 entwicklen. Zwar hat sich mit ASP.NET 3.5 bzw SP1 ein wenig getan in Richtung Datenmodellierung und LINQ. Massiv findet man diese Funktionen  nicht Projekten und es ist auch nicht immer die beste Wahl. Dazu kommt nun mit ASP.NET 4 eine Reihe neuer Features und Verbesserungen im Detail. So werde ich sicher auf neue Controls bzw Änderungen in den Controls eingehen. Als Beispiel das Menu Steuerelement das nun endlich LI Tags rendern kann. Es exisitieren einige neuen EInstellungen auch in der Web.config. Dabei kann z.B. über Cache Provider an der Performance gedreht werden. Ziemlich viel hat sich im Client Teil getan, auch als AJAX bekannt. Templatres, browser seitige Datenbindung, Anbindung an JSON WCF Services oder ADO.NET Dataservice sind nun möglich und werden im Workshop vermittelt. Also dieser Workshop ist für alle ASP.NET Entwickler geeignet die kurz und bündig das wichtigste bis zur Version 4.0 lernen wollen.

Expression Blend Media Player

In meinen Microsoft Expression Blend Schulungen gehört Video und Audio im Internet zum Standard Inhalt. Mit Expression Encoder ist es ein leichtes aus einem Video eine Silverlight Projekt samt inkludierten Media Player zu generieren. Wem das optisch nicht gefällt, kann auch einen Media Player in wenigen Minunten im Eigenbau erzeugen. Das Silverlight Media Element bietet dafür die nötige Funktionalität. Aber es geht noch mehr.   Expression Blend 3 enhält als Steuerelement einen kompletten Player. Der Funktionsumfang lässt eigentlich nichts zu wünschen übrig. Um Videos hinzuzufügen wird eine Playlist erzeugt. Im Menüpunkt Items kann dann die Liste der Videos angelegt werden. <ExpressionMediaPlayer:MediaPlayer d:LayoutOverrides="Width, Height"> <ExpressionMediaPlayer:MediaPlayer.Playlist> <ExpressionMediaPlayer:Playlist/> </ExpressionMediaPlayer:MediaPlayer.Playlist> </ExpressionMediaPlayer:MediaPlayer>   Für die einzelnen Filme in der Playlist, kann dann definiert werden: Title, Kapitel oder auch Preview Bilder. Wenn man eine externe Quelle hat, muss man im Context Menü über Custom Expression die URL des Videos eintragen. Nach ausführen der  Silverlight Anwendung mit (F5) startet nach kurzer Zeit der Film. Das Video wird also angezeigt während es noch runtergeladen wird. Das nennt man progressive Download. Der Blend Player zeigt den Status dazu auch unten an. Der graublaue Balken informiert den Benutzer wieviel von den Daten bereits angekommen sind. Der graue Schieberegler zeigt die Abspielposition. Innerhalb des blauen Balkens kann der Benutzer auch repositionieren. Rechts davon aber nicht*. Mit dem Werkzeug HTTPFiddler kann man den laufenden Download auch gut beobachten (hier rechts der Screenshot) Wenn der Webserver es unterstützt kann auch beim Download per GET *repositioniert werden.  IIS7 bietet das dafür nötige HTTP Range Kommando.

1 Tag Entity Framework lernen -zum gnstig Preis

Mehr Wissen in kürzerer Zeit, ist das Motto der ppedv Quickys. Diese neue Seminarreihe greift ganz konkrete Problemstellungen aus der Projektpraxis auf. Dieses mal geht es ums Entity Framework. Gerade die mittlere Schicht für den Datenzugriff wirft unglaublich viele Fragen auf. Was ist der beste Weg? Nehme ich nhibernate oder doch was von Microsoft? Wie löse ganz konkrete Aufgabenstellungen?  Genau das erwartet Sie an jedem der ppedv Standorte an einem Tag und zum unschlagbaren Preis. Natürlich Hands on um es selbst auszuprobieren. Die Teilnehmerzahl ist auf 10 pro Ort begrenzt. 30. Nov. in Köln 01. Dez. in Siegen 02. Dez. in Frankfurt 03. Dez. in Karlsruhe 04. Dez. in Stuttgart 07. Dez. in Dresden 08. Dez. in Leipzig 09. Dez. in München 10. Dez. in Burghausen 11. Dez. in Wien Also gleich anmelden und von den ppedv Experten lernen. Schliesslich ist die Architektur Entscheidung einer der wichtigstem im Softwareprojekt.

Golden Hammer

Produktivität ist einer (der) Schlüssel zum Erfolg eines Unternehmens. Ein Unternehmen das die produktivsten Prozesse besitzt, kann günstiger am Markt anbieten und/oder höhere Margen erzielen. In der Rolle des Entscheiders ist also für mich Produktivität ein hoher Wert, auch in der Softwareentwicklung. Ich hadere akutell noch mit der Meßbarkeit, das ist aber ein anderes Thema. Ein Baustein zu mehr Produktivität ist der Einsatz des best passenden Werkzeuges für den jeweiligen Arbeitseinsatz. Das setzt natürlich die gute Kenntnis der Werkzeuge vorraus. Hier setzen wir mit unseren Schulungen und Events an, um  dieses Wissen beim Entwickler  zu erzeugen. In der Praxis erlebe ich aber oft das genaue Gegenteil. Mühsam erworbenes Detail Know How wird plötzlich überall eingesetzt, auch wenn es anders einfacher gehen könnten. Die Frage wird einfach nicht mehr gestellt. Wenn man WCF gut verstanden hat wird plötzlich alles Service orientiert entwickelt, obwohl z.B. ein simpler SQL Datenzugriff per Datareader viel schneller sein kann. Sowohl in Ausführung als auch Implementierung. Wenn man Test Driven verstanden hat, muss immer zuerst der Test entwickelt werden, auch wenn die erzeugte Software nur von 5 Leuten ein paar Tage verwendet wird. Allein um das Vorgehens willen wird die Methode angewandt. Alle Leute die das nicht verstehen sind dann keine guten Programmierer. Dies nennt man “Golden Hammer”. Der Begriff stammt aus einer Reihe von Antipattern, nach dem Motto, so sollte man es nicht machen. Wunderwaffe (engl. Golden hammer)Ein bevorzugter Lösungsweg wird als universell anwendbar angesehen http://de.wikipedia.org/wiki/Anti-Pattern

Silverlight Paging mit Entity Framework ist irgendwie komisch

Ist steh ja auf qualifizierte Fehlermeldungen wie “Geht nicht”. Aber in diesem Fall lässt sich das Verhalten kaum textuell beschreiben. Was braucht man? Visual Stduio 2008, Silverlight, Datagrid, Datapager, Entity Framework 1.5 ( aus SP1) Datenmodell, .NET Ria Services und DomainDatasource. Und dann noch identische Loadsize und Pagesize Werte. Schon hat man irgendwie komisches Verhalten beim Paging. Kurze XAML Snippets <riaControls:DomainDataSource x:Name="quelle" QueryName="GetSomeQuery" AutoLoad="True" LoadSize="15"> Dann noch der Pager <data:DataPager Source="{Binding Data,ElementName=quelle}" PageSize="15"></data:DataPager> Workaround: in der Domain Service Klasse beim laden der Daten eine Order Bedingung mit angeben. Hier per LINQ erledigt. Die Zeile 7 ist der Zustand vorher. Public Function GetSome() As IQueryable(Of SessionSprecher) Dim qry = From s In Me.Context.SessionSprecher _ Order By s.Titel _ Select s Return qry 'Return Me.Context.SessionSprecher End Function Ich halte das für einen Bug!

Silverlight Tooltip lsst sich nicht binden

Aus der Kategorie Bug kommt heute die Frage nach dem Binden eines Feldes an einen Tooltip und das ganz im Datagrid von Silverlight. Weder Version 2 noch 3 können dies und verursachen seltsame Fehlermeldungen zur Laufzeit. AG_E_PARSER_PROPERTY_NOT_FOUND [Line: 70 Position: 77] Dies liegt daran das XAML Code beim kompilieren nur auf das Schema geprüft wird. Wenn dann ungültige Eigenschaften auftauchen krahct es erst später. Zur verdeutlichung, folgendes geht nicht <data:DataGridTextColumn ToolTipService.ToolTip="{Binding Title}"></data:DataGridTextColumn>   statt dessen muss ein Template verwendet werden <data:DataGridTemplateColumn Header="Titel" SortMemberPath="Titel"> <data:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding Titel}" <ToolTipService.ToolTip> <ToolTip> <TextBlock TextWrapping="Wrap" Width="300" Text="{Binding beschreibung}"> </TextBlock> </ToolTip> </ToolTipService.ToolTip> </TextBlock> </DataTemplate> </data:DataGridTemplateColumn.CellTemplate> </data:DataGridTemplateColumn> Mehr zu solchen Themen wie immer in meinen Kursen