DevForce unterstützt inzwischen den Code-First Ansatz

by wmn 18. November 2011 17:30

Seit Kurzem ist eine neue Version von DevForce (www.Ideablade.com) freigegeben worden. Jetzt unterstützt das Produkt auch den Code-First Ansatz im Zusammenspiel mit dem Entity-Framework. Nähere Informationen gibts wie immer hier: www.devforce.de

Außerdem gibt es seit einigen Tagen feste Lizenzpreise in Euro! Die Preisliste findet sich ebenfalls auf der deutschen Webseite. Wer nicht per Kreditkarte bestellen will kann das Produkt auch über TMN beziehen und mit Rechnung bezahlen (www.tmn-systemberatung.de ).

Der Einstieg in DevFORCE – Beispiel mit Anleitung verfügbar

by wmn 11. October 2011 17:58

Will man sich einen ersten Überblick über DevForce verschaffen, kann man jetzt auf unserer neuen Domain die ersten Infos auf Deutsch beschaffen. Neben einem deutschen Whitepaper gibt es (neu) auch ein deutsches Tutorial, wie man in der Praxis mit DevForce umgeht – samt Quellcode und Schritt für Schritt Anleitung. Das ganze findet man unter www.devforce.de

Informationen zu DevForce

by wmn 30. September 2011 18:08

Auf der BASTA habe ich das Produkt DevForce vorgestellt. Als Partner von Ideablade sind wir als Ansprechpartner in Deutschland aktiv. Wir haben daher auf unserer Homepage angefangen entsprechende Informationen zum Produkt bereit zu stellen. Erste Unterlagen haben wir auch schon übersetzt. Bei Fragen bitte einfach anrufen: Infos zu DevForce

Vortragsunterlagen zum BASTA-Vortrag Silverlight und MVVM mit Caliburn-Micro in der Praxis

by wmn 28. September 2011 19:36

Gestern hatte ich in Mainz meine Projektfallstudie vorgestellt. Präsentiert wurde eine Silverlight-Anwendung in der wir Caliburn-Micro, Ideablade DevForce sowie die Telerik Controls verwendet haben. Im Vortrag ging es dann hauptsächlich um die Gesamtarchitektur der Anwendung sowie das Zusammenspiel der verschiedenen Bibliotheken. Auf den letzten Seiten der Präsentation finden sich auch die Links zu weiterführenden Informationen.

Präsentation zur Projektfallstudie

Sehen wir uns auf der BASTA?

by wmn 23. September 2011 20:28

Ich möchte nur nochmals darauf hinweisen, dass wir als Partner von Ideablade dieses Jahr auf der BASTA in Mainz ausstellen werden.

Außerdem werden wir im Rahmen einer Projektfallstudie ein Silverlight-Projekt von uns vorstellen.

Wer näheres wissen will findet die Infos hier: www.basta.net

Ich würde mich freuen, den ein oder anderen in Mainz begrüßen zu können. Bis kommende Woche.

Micha

Tracing and Caching fürs Entity Framework

by wmn 4. August 2011 19:13

Tracing und Caching sind wichtige Dinge insbesondere bei größeren Anwendungen. Hierzu kann man sich viele Dinge selber erstellen. Wer dazu keine Zeit hat sollte mal einen Blick auf die Tools werfen, die vom Entity-Framework-Team bereitgestellt wurden. Hier ist auch nochmals ziemlich gut erklärt, wie man sich in die bestehende Architektur des Entity-Frameworks “einklinken” kann.

http://code.msdn.microsoft.com/EFProviderWrappers

Schon entdeckt? Entity Designer Database Generation Power Pack

by wmn 20. July 2011 17:41

Im Entitydesigner von Visual Studio kann man ja sein Datenmodell inzwischen recht bequem pflegen. Es ist inzwischen auch möglich erst ein reines konzeptuelles Modell der Datenbank in Visual Studio anzulegen und später aus diesem Modell heraus die Datenbank generieren zu lassen (Model first). Allerdings bietet der Designer nicht alle erforderlichen Funktionen an, die man sich so wünschen würde. Hier greift das obengenannte “Power Pack” an und erweitert die Funktionalität.

Eine gute Beschreibung hierzu gibts hier: http://blogs.msdn.com/b/adonet/archive/2010/02/08/entity-designer-database-generation-power-pack.aspx

und hier eine kurze deutsche Einführung mit einigen Hinweisen auf typische Problemchen beim Start: http://www.databinding.net/blog/post/2010/08/20/entity-framework-4-model-first-der-tph-strategie-mit-hilfe-des-entity-designer-database-generation.html

Den aktuellen Download (juli 20111) gibts hier:http://visualstudiogallery.msdn.microsoft.com/df3541c3-d833-4b65-b942-989e7ec74c87

.Net Stammtischvortrag zu DevForce und RIA-APPLICATIONS am 25.5.11

by wmn 26. May 2011 21:03

Gestern haben wir einen Vortrag von Marcel Good von Ideablade aus Californien gehört. Er hat das Produkt DevForce vorgestellt, das wir auch in unseren Projekten bereits mit Erfolg einsetzen. In dem vorgeführten Live-Beispiel wurde es, denke ich, allen Beteiligten klar wieviel Zeit man sich durch den Einsatz von DevForce sparen kann. Wer WPF- oder Silverlightanwendungen entwickelt sollte sich dieses Produkt unbedingt einmal ansehen.

In den kommenden Tagen stellen wir das zugehörige Material auf der .NET-Stammtischhomepage noch online: www.devgroup-stuttgart.de

Wer sich näher für das Produkt interessiert kann bei mir auch noch eine Zusammenfassung der Produktfeatures im Vergleich zu den RIA-Services bekommen. Bitte meldet Euch einfach bei mir.

Hier noch der Link auf die Homepage von IdeaBlade: www.ideablade.com

Unterlagen DevCon Frankfurt 2010

by wmn 16. November 2010 01:00

Auf der DevCon in Frankfurt (www.devcon.dfpug.de)  habe ich wieder mal zahlreiche Vorträge gehalten. Mein Dank geht an alle, die so lange durchgehalten haben und sich teilweise sogar abends noch unsere Fallstudie bis 22:30 Uhr angetan haben!

Wer es nochmals braucht bzw. die Unterlagen noch nicht hat, kann die Vortragsunterlagen hier  herunterladen. Fragen und Ideen sind natürlich jederzeit gerne willkommen.

Vortragsunterlagen BASTA 2010 – Silverlight Offline Daten

by wmn 24. September 2010 20:30

Die Basta ist vorbei, meine Session auch. Ich danke allen Teilnehmern, die so kurz vor Schluß noch so zahlreich zu meiner Session gekommen sind und dann auch noch an der Diskussion teilgenommen haben. Offensichtlich ist das doch ein Thema, was nicht nur mich interessiert.

Wie versprochen kommt hier der Link zu meinen Beispielen und den Folien, die  ich gezeigt habe.

Für Fragen habe ich immer ein offenes Ohr und würde mich über Rückmeldungen freuen. Vielleicht sieht man sich ja auf der Webtech oder der Frühjahrs-Basta wieder..

Tags:

c# | LINQ | Silverlight

Linq to SQL Fremdschlüssel programmatisch umsetzen

by wmn 10. February 2010 22:24

In LinqtoSQL gibt es ein Problem, wenn man versucht Fremdschlüssel eines Datensatzes programmatisch umzusetzen, wenn es sich bei den beteiligten Tabellen um eine 1:n Beziehung handelt. In meinem Fall von heute ging es darum, den zugehörigen Parent-Datensatz “umzuhängen”.  Als Entwickler ist man geneigt einfach den Foreign-Key mit dem anderen Schlüssel zu ersetzen. In Linq führt das zu einer Exception:

image

image

Lösung:
Statt nur den Fremdschlüssel umzusetzen muss man die ganze Referenz umhängen indem man das neue, richtige Objekt zuweist. Linq löst hinter den Kulissen beim Speichern die IDs richtig auf und schreibt den geänderten Fremdschlüssel richtig weg. Auch in diesem Fall ist die Fehlermeldung nicht gerade sehr hilfreich!

Tags:

WPF | LINQ

Verwendung der WPF ComboBox mit Linq

by wmn 25. November 2009 22:28

Nachdem ich selber kein vernünftiges Beispiel zu diesem Thema gefunden habe, kommt hier kurz zusammengefasst die Verwendung der WPF/Silverlight Combobox nochmal im Zusammenspiel mit LINQ.

Folgende Tabellen liegen diesem Beispiel zugrunde:

image

Im Beispiel soll über eine Combobox die aktuelle Position des Mitarbeiters eingetragen werden. In der Mitarbeitertabelle gibt es dazu das ForeignKey-Feld FK_Position und eine Relation zur Tabelle Position, die als Lookuptabelle dient.

In meiner Pflegemaske ist die Liste der Mitarbeiter so definiert:

image

In meiner Pflegemaske ist die Combo so definiert:

image

Und im Codebehind der Maske werden die Daten wie folgt geladen:

image

Ganz wichtig damit der Refresh der Combobox richtig funktioniert:

Im Listview, der die Mitarbeiterliste anzeigt, muss die Eigenschaft IsSynchronizedWithCurrentItem=”True” zu setzen!! Nur dann wird der aktuelle “Datensatz” in der Collection beim Blättern in der Liste auch umgesetzt und nur dadurch refreshed sich auch die Combobox wie gewünscht.

Tags:

WPF | LINQ

MDA (Managed Debug Assitant) Fehler unterbinden

by wmn 4. November 2009 22:29

Wenn man eine Visual Studio-Anwendung debugged und hat darin lang laufende LINQ-Abfragen (sicherlich passiert das auch bei Dingen die in anderen Threads asynchron laufen) kommt es zu MDA-Fehlern und dem Hinweis auf einen ContextDeadlock. Die Meldung hilft einem dabei auch nicht wirklich weiter, zumal das Problem nur beim debuggen einer Anwendung auftritt. Dieses Verhalten kann man über einen Schalter vom Visual Studio im Menü  Debug – Exceptions – Managed Debug Assistants deaktivieren/einschalten

image

Danach läuft die Anwendung in der Regel ohne anzuhalten durch.

Tags:

LINQ | WPF

Informationen zu den neuen LINQ DataServices

by wmn 4. November 2008 19:09

LINQ to SQL ist ja bisher nicht in der Lage gewesen in einer richtigen mehrschichtigen Architektur zu laufen. Seit kurzem sind die sogenannten DataServices von Microsoft released worden. Damit ist es dann möglich die Datenabfragen per http-Request an einen entfernten DataService Endpoint "auszulagern".

Nähere Informationen findet man hier:

http://msdn.microsoft.com/en-us/library/cc956153.aspx

http://msdn.microsoft.com/en-us/library/cc907912.aspx

http://msdn.microsoft.com/en-us/library/cc907912.aspx


Tags:

c# | LINQ | WPF

mit LINQ ein Verzeichnis auslesen

by wmn 4. November 2008 19:03





Mit LINQ kann man ja nun alle möglichen Datenquellen abfragen. Ein Beispiel dafür ist eine Abfrage auf ein Verzeichnis und dessen Inhalt:

 

var files = from file in new DirectoryInfo(@"C:\").GetFiles()

            where file.Name.StartsWith("_")

            select file;

Tags:

c# | LINQ

SQL Server Datenbanken – Ersatz für Stonefield Data Dictionary

by wmn 4. October 2008 20:12

Viele von uns haben ja bereits ihre Anwendung auch mit SQL-Server-Datenbanken am laufen. In diesem Fall hat man aber das Problem bei der Verteilung der Anwendung vor Ort die Datenbankstrukturen aktuell zu halten. Unter FoxPro konnte man dafür ja Stonefield Data Dictionary einsetzen was aber mit SQL-Server nicht mehr funktionert.

Ein Ersatz hierfür gibt es aber, welcher einem auch die Bereitstellung von entsprechenden Installationsscripts massiv erleichtert:

SQL Packager

Latest version: 5.5

Packages a database or a database update

  • Script your entire database accurately and quickly
  • Move your database from A to B
  • Compress your database as a .exe, or launch as a Visual Studio project
  • Simplify database deployments and installations – SQL Server 2000, 2005 and 2008
  • Easy roll-out of database application updates across your client base

"SQL Packager is one of the most useful tools I have ever seen. The ability to package the database schema and data of preconfigured lookup tables is great. I have tested it using one of our customer databases and it works fine. The new database has been installed correctly on the new server" Thomas Stensitzki, iComCept GmbH

Walk-through

View our short screen-by-screen introductory walk-through

Demo video

Step-by-step demo of SQL Packager in action

Standard Edition €245

Packages a database or a database update.

Pro Edition €395

SQL Packager Pro offers access to the command line interface.

With SQL Packager Pro, you can package a database or a database update, as well as automate tasks, thanks to the incorporated command-line interface.

SQL Packager works by scripting and compressing the entire database – schema and data together – and packaging it up as a deliverable .exe file. It does this by scripting separate transactions for schema and data respectively.

When migrating databases, all schema objects, all new tables and their data as well as data with unique indexes or constraints are also scripted.

Installing, updating, or distributing your database now becomes a simple point-and-click procedure. Deploy SQL Server 2005 databases, and applications that depend on them, with no manual scripting!

By letting you compress your packaged database, you can reduce storage overhead and distribute it faster and more easily. SQL Packager also makes it easy to archive your database, and is an excellent solution for making a backup of your database where you don't have SQL Server administration rights.

You can read how iCOMcept in Aachen, Germany, minimized their application deployment window using SQL Packager.

Tags:

c# | LINQ | SQL Server | FoxPro

Zugriff auf FoxPro-Tabellen mit LINQ (VB)

by wmn 12. September 2008 20:16

Kürzlich habe ich ein Beispiel für den Zugriff auf FoxPro-Tabellen mit LINQ gefunden. Das Beispiel ist leider in VB geschrieben, was sich ja aber leicht umstellen lässt….

Today, we'll make a query to my Foxpro picture database of 28,000 pictures/movies. We'll make the query result structure to be similar to the prior post, so the same code will show the picture or movie in a tooltip. The query is for "wheel", which includes pictures of cartwheels, Ferris Wheels, wheelbarrows.

We can use the System.Data.DataRowExtensions to access the DataTable filled by the OledbDataAdapter without using DLINQ

Dim Query

If

True

Then

' if you want the prior sample, just change this to false

Dim dt As

New DataTable

_rootFolder = "e:\Pictures"

Dim da = New OleDbDataAdapter( _

"Select fullname as FileName,Notes from mypix where 'wheel'$lower(notes)", _

"Provider=VFPOLEDB.1;Data Source=" + _rootFolder + "\mypix.dbf")

da.Fill(dt)

Query = From picrow In dt.AsEnumerable _

Select FileName = picrow.Field(Of

String)("FileName"), _

Description = picrow.Field(Of

String)("Notes") _

Select FileName, _

Description, _

Type = IO.Path.GetExtension(FileName).Substring(1), _

Size = (New IO.FileInfo(_rootFolder + IO.Path.DirectorySeparatorChar + FileName)).Length

Else

Query = From file In IO.Directory.GetFiles(_rootFolder, _

"*.*", IO.SearchOption.AllDirectories) _

Select file, Ext = IO.Path.GetExtension(file).ToLower _

Where Ext.Length > 0 AndAlso

".avi .jpg .mid .mpg .wma .wmv".Contains(Ext) _

Select FileName = file.Substring(_rootFolder.Length + 1), _

Type = Ext.Substring(1), _

Size = (New IO.FileInfo(file)).Length

End

If

  1. Start Visual Studio 2008

  2. Choose File->New Project->Visual Basic->WPF Application

  3. Double click the form designer to bring up the Window1.xaml.vb file. Replace the contents with the code below.

  4. Change the oledb provider connection string to your data

  5. Hit F5 to run the program

Imports System.Windows.Controls.Primitives ' for Popup

Imports System.Data

Imports System.Data.OleDb

Imports System.Data.DataTableExtensions

Partial

Public

Class Window1

Dim _rootFolder As

String = System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)

Private

Sub Window1_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles

MyBase.Loaded

Me.Width = 800 : Me.Height = 800

Dim Query

If

True

Then

' if you want the prior sample, just change this to false

Dim dt As

New DataTable

_rootFolder = "e:\Pictures"

Dim da = New OleDbDataAdapter( _

"Select fullname as FileName,Notes from mypix where 'wheel'$lower(notes)", _

"Provider=VFPOLEDB.1;Data Source=" + _rootFolder + "\mypix.dbf")

da.Fill(dt)

Query = From picrow In dt.AsEnumerable _

Select FileName = picrow.Field(Of

String)("FileName"), _

Description = picrow.Field(Of

String)("Notes") _

Select FileName, _

Description, _

Type = IO.Path.GetExtension(FileName).Substring(1), _

Size = (New IO.FileInfo(_rootFolder + IO.Path.DirectorySeparatorChar + FileName)).Length

Else

Query = From file In IO.Directory.GetFiles(_rootFolder, _

"*.*", IO.SearchOption.AllDirectories) _

Select file, Ext = IO.Path.GetExtension(file).ToLower _

Where Ext.Length > 0 AndAlso

".avi .jpg .mid .mpg .wma .wmv".Contains(Ext) _

Select FileName = file.Substring(_rootFolder.Length + 1), _

Type = Ext.Substring(1), _

Size = (New IO.FileInfo(file)).Length

End

If

Me.Content = New BrowseWithMedia(Query, Me)

Me.Title = _rootFolder + " #Items = " + _

CType(Me.Content, BrowseWithMedia).Items.Count.ToString

End

Sub

Private

Sub Window1_Deactivated(ByVal sender As

Object, ByVal e As System.EventArgs) Handles

Me.Deactivated

Dim pop = CType(Me.Content, BrowseWithMedia)._lvPopUp ' no popup if user changes active window (Alt-Tab)

If

Not pop Is

Nothing

AndAlso pop.IsOpen Then

pop.IsOpen = False

End

If

End

Sub

Private

Class BrowseWithMedia : Inherits Browse

Dim _Parent As Window1 ' reference to container

Friend _lvPopUp As Popup ' popup window to show tip with movie

Dim

WithEvents _lvTimer As

New System.Windows.Threading.DispatcherTimer ' timer: after delay, show tip

Sub

New(ByVal Query As

Object, Optional

ByVal Parent As

Object = Nothing)

MyBase.new(Query, Parent)

_Parent = Parent

End

Sub

Sub HandleWheel(ByVal sp As StackPanel, ByVal e As System.Windows.Input.MouseWheelEventArgs) 'Handles Me.MouseWheel

Dim transform = CType(sp.RenderTransform, ScaleTransform)

Dim melem As MediaElement = sp.Children(1)

If e.Delta > 0 Then

melem.Height *= 1.1

melem.Width *= 1.1

'transform.ScaleX *= 1.1 ' to scale tip text too

'transform.ScaleY *= 1.1

Else

'transform.ScaleX /= 1.1

'transform.ScaleY /= 1.1

melem.Height /= 1.1

melem.Width /= 1.1

End

If

End

Sub

Dim _mdownPt As Point

Sub HandleClick(ByVal sp As StackPanel, ByVal e As MouseButtonEventArgs)

If sp.IsMouseCaptured Then

sp.ReleaseMouseCapture()

End

If

If e.LeftButton = MouseButtonState.Pressed Then

_mdownPt = Mouse.GetPosition(sp) ' record mouse pos relative to sp

sp.CaptureMouse()

End

If

End

Sub

Sub HandleMouseMove(ByVal sp As StackPanel, ByVal e As MouseEventArgs)

If Mouse.LeftButton = MouseButtonState.Pressed Then

If sp.CaptureMouse Then

Dim curpt As Point = sp.PointToScreen(Mouse.GetPosition(sp))

_lvPopUp.HorizontalOffset = curpt.X - _mdownPt.X ' subtract mouse pos rel to sp

_lvPopUp.VerticalOffset = curpt.Y - _mdownPt.Y

_lvPopUp.Placement = PlacementMode.Absolute ' PlacementMode.Mouse

End

If

End

If

End

Sub

Sub HandlePopupTimerTick() Handles _lvTimer.Tick ' show the popup

_lvTimer.IsEnabled = False

' enabled in HandleRowSelected

Dim lbi As ListBoxItem = Me.ItemContainerGenerator.ContainerFromIndex(Me.SelectedIndex)

If

Not lbi Is

Nothing

Then

Dim sp As

New StackPanel

Dim cSrcFile = _Parent._rootFolder + IO.Path.DirectorySeparatorChar + lbi.Content.FileName.ToString

Dim XAMLPopup = _

<Popup

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Placement="Right"

IsOpen="False"

>

<StackPanel

Orientation="Vertical">

<StackPanel.RenderTransform>

<ScaleTransform

ScaleX="1"

ScaleY="1"/>

</StackPanel.RenderTransform>

<TextBlock

Foreground="Black"

Background="LightYellow">

<%= cSrcFile + " " + CType(lbi.Content.size / 1024, Int32).ToString("n0") + "K"

%>

</TextBlock>

<MediaElement

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Name="MyVid"

Height="250">

<MediaElement.Triggers>

<EventTrigger

RoutedEvent="MediaElement.Loaded">

<EventTrigger.Actions>

<BeginStoryboard>

<Storyboard>

<MediaTimeline

Source=<%= cSrcFile %>

Storyboard.TargetName="MyVid"

RepeatBehavior="Forever"/>

</Storyboard>

</BeginStoryboard>

</EventTrigger.Actions>

</EventTrigger>

</MediaElement.Triggers>

</MediaElement>

</StackPanel>

</Popup>

_lvPopUp = System.Windows.Markup.XamlReader.Load(XAMLPopup.CreateReader)

_lvPopUp.PlacementTarget = lbi

_lvPopUp.IsOpen = True

Dim stackpanel As StackPanel = _lvPopUp.Child ' only child is the stackpanel

AddHandler stackpanel.MouseWheel, AddressOf HandleWheel ' mouse wheel will zoom in/out

AddHandler stackpanel.MouseDown, AddressOf HandleClick ' mouse click/drag will move picture/movie

AddHandler stackpanel.MouseUp, AddressOf HandleClick

AddHandler stackpanel.MouseMove, AddressOf HandleMouseMove

End

If

End

Sub

Sub HandleRowSelected(ByVal sender As

Object, ByVal e As RoutedEventArgs) Handles

Me.SelectionChanged

Dim lb = CType(sender, ListBox)

If

Not lb Is

Nothing

AndAlso (lb.SelectedIndex >= 0) Then

Dim lbi As ListBoxItem = lb.ItemContainerGenerator.ContainerFromIndex(lb.SelectedIndex)

If

Not _lvPopUp Is

Nothing

AndAlso _lvPopUp.IsOpen Then

_lvPopUp.IsOpen = False

End

If

_lvTimer.Stop() ' stop prior timer, if any

_lvTimer.Interval = TimeSpan.FromMilliseconds(500)

_lvTimer.Start()

End

If

End

Sub

End

Class

End

Class

Class Browse

Inherits ListView

Sub

New(ByVal Query As

Object, Optional

ByVal Parent As

Object = Nothing)

Dim gv As

New GridView

Me.View = gv

Me.ItemsSource = Query

If

Not Parent Is

Nothing

Then

If Parent.GetType.BaseType Is

GetType(Window) Then

CType(Parent, Window).Title = "# items = " + Me.Items.Count.ToString

End

If

End

If

Me.AddHandler(GridViewColumnHeader.ClickEvent, New RoutedEventHandler(AddressOf HandleHeaderClick))

For

Each mem In

From mbr In _

Query.GetType().GetInterface(GetType(IEnumerable(Of )).FullName) _

.GetGenericArguments()(0).GetMembers _

Where mbr.MemberType = Reflection.MemberTypes.Property

Dim coltype = CType(mem, Reflection.PropertyInfo).PropertyType.Name

Select

Case coltype

Case

"Int32", "String", "Int64"

Dim gvc As

New GridViewColumn

gvc.Header = mem.Name

gv.Columns.Add(gvc)

If coltype <> "String"

Then

gvc.Width = 80

Dim XAMLdt = _

<DataTemplate

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

>

<StackPanel

Orientation="Horizontal">

<TextBlock

Name="tb"

Text=<%=

"{Binding Path=" + mem.Name + "}"

%>

Foreground="Black"

FontWeight="Bold"

Background="SpringGreen">

</TextBlock>

</StackPanel>

</DataTemplate>

gvc.CellTemplate = System.Windows.Markup.XamlReader.Load(XAMLdt.CreateReader)

Else

gvc.DisplayMemberBinding = New Binding(mem.Name)

gvc.Width = 180

End

If

End

Select

Next

Dim XAMLlbStyle = _

<Style

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

TargetType="ListBoxItem">

<Setter

Property="Foreground"

Value="Blue"/>

<Style.Triggers>

<Trigger

Property="IsSelected"

Value="True">

<Setter

Property="Foreground"

Value="White"/>

<Setter

Property="Background"

Value="Aquamarine"/>

</Trigger>

<Trigger

Property="IsMouseOver"

Value="True">

<Setter

Property="Foreground"

Value="Red"/>

</Trigger>

</Style.Triggers>

</Style>

Me.ItemContainerStyle = Windows.Markup.XamlReader.Load(XAMLlbStyle.CreateReader)

End

Sub

Dim _Lastdir As System.ComponentModel.ListSortDirection = ComponentModel.ListSortDirection.Ascending

Dim _LastHeaderClicked As GridViewColumnHeader = Nothing

Sub HandleHeaderClick(ByVal sender As

Object, ByVal e As RoutedEventArgs)

If e.OriginalSource.GetType Is

GetType(GridViewColumnHeader) Then

Dim gvh = CType(e.OriginalSource, GridViewColumnHeader)

Dim dir As System.ComponentModel.ListSortDirection = ComponentModel.ListSortDirection.Ascending

If

Not gvh Is

Nothing

AndAlso

Not gvh.Column Is

Nothing

Then

Dim hdr = gvh.Column.Header

If gvh Is _LastHeaderClicked Then

If _Lastdir = ComponentModel.ListSortDirection.Ascending Then

dir = ComponentModel.ListSortDirection.Descending

End

If

End

If

Sort(hdr, dir)

_LastHeaderClicked = gvh

_Lastdir = dir

End

If

End

If

End

Sub

Sub Sort(ByVal sortby As

String, ByVal dir As System.ComponentModel.ListSortDirection)

Me.Items.SortDescriptions.Clear()

Dim sd = New System.ComponentModel.SortDescription(sortby, dir)

Me.Items.SortDescriptions.Add(sd)

Me.Items.Refresh()

End

Sub

End

Class

Tags:

FoxPro | LINQ | VB