Michael Niethammers Blog

15.9.2009

WPF Multibinding – schon gewusst?

Abgelegt unter: C#, Visual Studio, WPF — wmn @ 15:26

Seit der Version 3.5 SP1 gibt es beim Databinding ein neues Feature, das man z.B. für die Anzeige von Tooltips bequem nutzen kann:

Dies hier wäre wohl der “klassische Ansatz um mehrere Texte als Tooltip anzuzeigen:

<Element>
  <
Element.Tooltip>
    <
StackPanel Orientation=“Horizontal”>
      <
TextBlock Text=“{Binding Path=Feldwert1}”/>
      <
TextBlock Text=“% von, “/>
      <
TextBlock Text=“{Binding Path=Feldwert2}”/>
      <
TextBlock Text=“% bis”/>
    </
StackPanel>
  </
Element.Tooltip>
</
Element>

So gehts inzwischen aber auch:

<TextBox.Text>
    <
MultiBinding StringFormat=“{}{1:#0}% von, {2:#0}% bis”>
      <
Binding Path=“Feldwert1″ />
      <
Binding Path=“Feldwert2″/>
    </
MultiBinding>
</
TextBox.Text>

Interessanterweise kann man diese Syntax auch in der Datenpflege anwenden. Das führt dazu, dass die Werte der zwei dahinterliegenden Felder in einer
Textbox erscheinen und dort auch gepflegt werden können. Allerdings ist das für den Anwender nicht gerade transparent wo das erste Feld aufhört und
wo das zweite anfängt. Auch das Thema Datenvalidierung wird dadurch sicher schwieriger. Insofern ist dieses neue Feature hier sicher nicht angebracht!

2.9.2009

Daten in einem ListView dynamisch anzeigen

Abgelegt unter: C#, Visual Studio — wmn @ 16:29

Häufig will man Daten, die einem bestimmten Status entsprechen oder bestimmte Werte überschreiten in einer Liste besonders hervorheben. Dies kann man in WPF recht einfach machen. Hier kann man sogar dynamisch die komplette optische Darstellung eines Elementes zur Laufzeit über einen Trigger austauschen.

Untenstehend habe ich einmal ein einfaches Beispiel aus einer WPF-Maske rauskopiert:

  1. Verwendet wird ein ListView-Steuerlement (erweiterte Listbox)
  2. der Trigger bzw. das Template ist der Einfachheit halber im XAML-Code direkt enthalten – im produktiven Einsatz sollte man diese in eine Ressource extrahieren damit man auch mehrere Spalten einfach daran binden kann
  3. Das Listview-Control ist an eine Collection gebunden, die über ein LINQ-Statement selektiert wird. Der Trigger schaltet die Farben abhängig vom Feldinhalt des Feldes Emplstatus (character) um:

<ListView x:Name=”lstPlanEmployees” IsSynchronizedWithCurrentItem=”True” ToolTip=”durch auswählen Personendaten anzeigen”  SelectionChanged=”lstPlanEmployees_SelectionChanged” FontSize=”12″ItemContainerStyle=”{DynamicResource ItemContStyle}” >
<ListView.View>
<GridView>
<GridViewColumn Width=”60″ >
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name=”txtStatusCol” Text=”{Binding Path=Emplstatus}” />
<DataTemplate.Triggers>
<DataTrigger Binding=”{Binding Path=Emplstatus}” Value=”aktiv”>
<Setter Property=”Foreground” TargetName=”txtStatusCol” Value=”Green” />
</DataTrigger>
<DataTrigger Binding=”{Binding Path=Emplstatus}” Value=”inaktiv” >
<Setter Property=”Foreground” TargetName=”txtStatusCol” Value=”Yellow” />
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn DisplayMemberBinding=”{Binding Path=Jobtext}” Header=”Jobtext” Width=”150″ />
<GridViewColumn DisplayMemberBinding=”{Binding Path=Name}” Width=”180″ Header=”Name” />
</GridView>
</ListView.View>
</ListView>

1.9.2009

WPF Datenvalidierung – Schritt für Schritt

Abgelegt unter: C#, Visual Studio — wmn @ 08:22

Jeder hat das Problem, dass eingegebene Daten validiert werden müssen, bevor sie in der Datenbank abgelegt werden. Der Anwender soll bereits bei der Eingabe entsprechende Hinweise zu seinen Eingaben erhalten. Unten habe ich mal eine kleine Einführung für eine der vielen möglichen Varianten der Datenvalidierung aufgeführt. Der Text ist etwas rudimentär ich hoffe es hilft trotzdem bei der Entwicklung:

Im Beispiel wurde eine ganz normale WPF-Anwendung erstellt. In das Projekt wurde eine LINQ to SQL- oder Linq to Entities-Klasse aufgenommen um einen Datacontext für den Zugriff auf die Datenbank zu haben.

Textbox-Control im XAML:

  • Databinding ganz normal  an ein Object mit InotifyPropertyChanged-Events z.b. direkt Objekte aus dem DataContext
  • Nach der Prüfung wird bei einem Fehler die Fehlermessage als Tooltip angezeigt
  • Optional könnte man den Style im Fehlerfall noch anpassen – default ist ein roter Rand

<TextBox Margin=”5,5,5,5″ Grid.Column=”1″ TextWrapping=”Wrap” Text=”{ Binding NoDEPC,ValidatesOnExceptions=True, NotifyOnValidationError=true }” Validation.Error=”TextBox_Error”>
</
TextBox>
Eventhandler für Fehler in der Datenvalidierung im Codebehind oder im Template….

private
void TextBox_Error(object sender,
ValidationErrorEventArgs e)
{
if (e.Action == ValidationErrorEventAction.Added)
            {
            ((Control)sender).ToolTip =
e.Error.Exception.InnerException.Message.ToString();
            }
  else
      {
           ((Control)sender).ToolTip = “”;
     }
}

Das gebundene Object z.B. aus dem Datacontext muss erweitert werden:
Hier: gebundenes Feld NoDEPC

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Business;
using System.Collections;

namespace Business
    {
// die EntityKlasse, die vom LINQ-Designer generiert
// wurde, wird hier noch erweitert

public partial class Profit_Center 
   {
   public void SetDefaultValues()
             {
             ID_ProfitCenter = Guid.NewGuid();
             NoDesoursys = “99″;
             NoDeco_Area = “XXXXX”;
             PNSourSys = “33″;
            PNCo_Area = “05″;
             IsActive = true;
             IsTemplate = false;
             }
// überschriebene erweiterte Methode aus der Klasse

partial void OnNoDEPCChanged()
   {
   // sobald das property geändert wird
   //z.B. durchs Verlassen der Textbox
   // läuft die Regelprüfung
   CheckNodePC(this.NoDEPC);
   }

//eigentliche Regelprüfung in der klasse
public string CheckNodePC(string Nodename)
   {
   string msg = “”;

        if(Nodename== null || Nodename== “”)
                 msg = “Profitcenternamen dürfen nicht leer sein “;
        if(Nodename.Contains(” “)== true)
                 msg += “Profitcenternamen dürfen keine Leerstellen enthalten”;

       if (msg !=“”)
           {
       // exception auslösen damit die message auch
       //an die GUI kommt
            throw new ArgumentOutOfRangeException(msg);
             return msg;
           }
         }
    }


 

Silverlight Tool

Abgelegt unter: Silverlight, Visual Studio — wmn @ 08:02

Bei komplexen Silverlight Anwendungen ist es manchmal schwierig genau zu erkennen, wo die Ladezeiten bzw. Fehler bei komplexen XAML-Dateien herkommen. Folgendes Tool hilft dabei: http://silverlightspy.com/

Silverlight Anwendungen deployen

Abgelegt unter: Silverlight — wmn @ 07:59

Hinweise zur InstaLLATION VON Silverlight Anwendungen findet man hier:

http://download.microsoft.com/download/7/8/d/78da8ec9-8801-42e5-89e5-3809386f1316/Silverlight%20Deployment%20Guide.doc

Neue Silverlight 3 Beispiele verfügbar

Abgelegt unter: Silverlight — wmn @ 07:56

Inzwischen sind ja die neuen Controls für Silverlight 3 frei verfügbar. Damit man sich mal ansehen kann welche neuen Controls es gibt kann man sich entsprechende Beispiele ansehen:

http://silverlight.net/samples/sl3/toolkitcontrolsamples/run/default.html#/Welcome.xaml

läuft stressfrei mit WordPress ( WordPress.de )