Archive for the ‘TrivadisContent’ Category

Here it is: The UpdateSourceTrigger for PropertyChanged in Silverlight

Friday, July 17th, 2009

Today I’ll show you how to implement a PropertyChanged-UpdateSourceTrigger for Silverlight. In Silverlight a Data Binding can have different UpdateSourceTriggers. An UpdateSourceTrigger specifies, when a TwoWay-DataBinding will update its source with the value of the Target-Property.

In most cases you have a TwoWay-DataBinding on TextBoxes. When the user types something into a TextBox, it should be written back to the underlying Data-Object. The other way, when the underlying Data-Object changes, the TextBox should show the actual value of the bound property.

In this post I’ll focus on the moment of writing the data back to the underlying object. In other words, when the data is updated with the text the user has typed in.

In Silverlight the underlying object is updated after the TextBox has lost its focus. In WPF, the UpdateSourceTrigger-Enum has a Member PropertyChanged. If you set the UpdateSourceTrigger-Property of the Data Binding to that value, the underlying object will be updated everytime the user changes the text. Unfortunately Silverlight doesn’t contain the PropertyChanged-Value in its UpdateSourceTrigger-Enum. It only contains a Default- and a LostFocus-Member. As the name implies, LostFocus will update the source when the TextBox loses its focus. But an Attached Property would do the trick.

When I tried to solve this problem I came across a post of Michael Sync, who showed up a solution with an attached-Property that works by stealing the focus everytime the Text of a TextBox changes, and immediately set it back to the TextBox again. Find his post under http://michaelsync.net/2009/06/10/silverlight-attached-properties-bindingupdatesourcetriggerpropertychanged

As I got deep knowledge about WPFs Binding-Engine, I could produce a solution for Silverlight, and I think I got a similar solution to Michael’s, but my solution is built closer on the binding-engine and doesn’t need a focus-trick. So, some details: Behind each Binding, a BindingExpression does the real work. All you have to do when the Text of the TextBox changes is to get the BindingExpression of the Data Binding and to call its UpdateSource-Method. So my Attached-Property-Class looks like the one below (Feel free to use the source in your projects, but please keep the reference to www.thomasclaudiushuber.com). As it is, it just works for the Text-Property of TextBoxes.

/// <summary>
/// Supports a PropertyChanged-Trigger for DataBindings
/// in Silverlight. Works just for TextBoxes
/// (C) Thomas Claudius Huber 2009
/// http://www.thomasclaudiushuber.com
/// </summary>
public class BindingHelper
{
  public static bool GetUpdateSourceOnChange
    (DependencyObject obj)
  {
    return (bool)obj.GetValue(UpdateSourceOnChangeProperty);
  }

  public static void SetUpdateSourceOnChange
    (DependencyObject obj, bool value)
  {
    obj.SetValue(UpdateSourceOnChangeProperty, value);
  }

  // Using a DependencyProperty as the backing store for ...
  public static readonly DependencyProperty
    UpdateSourceOnChangeProperty =
      DependencyProperty.RegisterAttached(
      "UpdateSourceOnChange",
      typeof(bool),
      typeof(BindingHelper),
      new PropertyMetadata(false, OnPropertyChanged));

  private static void OnPropertyChanged
    (DependencyObject obj,
    DependencyPropertyChangedEventArgs e)
  {
    var txt = obj as TextBox;
    if (txt == null)
      return;
    if((bool)e.NewValue)
    {
      txt.TextChanged += OnTextChanged;
    }
    else
    {
      txt.TextChanged -= OnTextChanged;
    }
  }
  static void OnTextChanged(object sender,
    TextChangedEventArgs e)
  {
    var txt = sender as TextBox;
    if(txt==null)
      return;
    var be = txt.GetBindingExpression(TextBox.TextProperty);
    if (be != null)
    {
      be.UpdateSource();
    }
  }
}

The usage of the BindingHelper-class is very simple. Just add it to your project, insert a matching xmlns to your XAML file that contains the CLR-Namespace the BindingHelper-class is in. When that is done, you can simply set the UpdateSourceOnChange-Property on a TextBox to true, and if the Text-Property is databound, you’ll have a Data Binding that will update its source on every PropertyChange. Like in WPF. :-)

<UserControl ...
    xmlns:local="clr-namespace:BindingHelperExample">
  <Grid x:Name="LayoutRoot">
      ...
    <TextBox Text="{Binding FirstName, Mode=TwoWay}"
    local:BindingHelper.UpdateSourceOnChange="True" />
      ...
    </Grid>
</UserControl>



If this post helped you, please kick it. :-)

kick it on DotNetKicks.com

Silverlight 3 and Expression Blend 3 are now avaibable

Thursday, July 9th, 2009

So I know, I’ve been really quiet for some time. There are many things going one. Currently I’m writing some articles (at least 6) for the German dotnet-magazine. Also I’m writing on a new book to Silverlight 3, and the timeline is very strict. That’s the reason why there is not as much time for blogging, but I’ll do better in the future. :-)

So, Silverlight 3 and Expression Blend 3 are just out, and this time I try to be faster than Tobias, the www.nextbestgeek.com  (even if he showed me the fastest way how to find the downloads). So find the downloads here:

Expression Blend 3 with Sketchflow

Silverlight 3 Software Development Kit (SDK)

Silverlight 3 Tools for Visual Studio 2008 SP 1

Cheers thomas:

PS: And next week I’ll show you how to support a PropertyChanged-UpdateSourceTrigger for Data Bindings in TextBoxes in Silverlight

First video to Silverlight 3 appeared on Channel 9

Wednesday, March 11th, 2009

On Channel 9 Brad Adams and Robert Hess are talking about the third Version of Silverlight. In more detail they are talking about "Silverlight 3.0 for Great Business Apps".

So as the title let’s except, there are features in the next Silverlight version that make it easier to build business applications. There are different things mentioned in the video, but "the super secret stuff" will be told at MIX09 in Las Vegas next week (starting at the 18th of March). So the most interessting points from the video are:

  • New set of controls ("tons of new controls")
  • Support for Back/Forward-Buttons of the Browser
  • Validation support

There is nothing said about commands (even if some logic for commands can be used from Prism2), nothing about Triggers, nothing about CollectionViews etc. All these points would be great for Business Applications that target the Model-View-ViewModel-Pattern.

So let’s wait what the MIX09-conference will bring. Today there is neither a Beta nor a Customer-Technology-Preview of Silverlight 3, but community voices expect a Beta or CTP to be released after MIX09 this month. I’m looking forward to grab it.

Just converted my PHP / CSS-based Homepage to a Silverlight 2.0 Website

Monday, March 2nd, 2009

Three weeks ago on a saturday morning I spent my thoughts on what to do with this last free saturday before the football-season starts. Unfortunately my girlfriend was not here, so Tabletennis was no alternative. But there were other possibilities:

  • Play Guitar all day long
  • Play on my new Tenorhorn (I haven’t told you that, right?)
  • Put my snowboard under my feet and go up on the mountain
  • Do some muscle-training and try to push up the 105kg more than 12 times
  • Look that Bankjob-DVD

… while I was thinking about all that, I surved on www.silverlight.net and then I thought, why not just build my classic homepage (http://www.thomasclaudiushuber.com) totally with silverlight 2.0. And that’s what I’ve done on that morning. :) Yesterday I’ve finished the page by implementing a php-call from Silverlight to make the contact-formular work (I’ve no ASP.Net-Support on my Webserver) Take a look at the resulting Silverlight-page on http://www.thomasclaudiushuber.com/pageInSilverlight.

I wanted the result to be as close as possible to the original page, and I think it is. Just with some animations. :-)

It was a rapid development process, but keep in mind that it’s also a really simple site. The language switch the php/css site has I left off in the Silverlight-Version, because I went also snowboarding in the afternoon as the snow-height is 63cm on the Belchen, a mountain in the black forest not far away from my home. Instead of the language-switch I’ve created a "fullscreen"-button (It was a one-liner :-) ). I also didn’t make a real Dataaccess through WebService-calls. The text-parts are statically inside the XAML-documents. But that wouldn’t be a big thing to change.

Through the development process of the Silverlight-page there were different things I knew from WPF and I was missing really extremly in Silverlight. Other things didn’t work as good as I thought they should. And at least there were also some good things. Let’s take a look at those that are "not so good":

The First "not-so-good": The TextBlock-Element can contain Inline-Elements. In WPF, there are many such Inline-Elements to format the text inside, like Bold, Italic, Run, LineBreak, Hyperlink, Span and so on. In Silverlight there are only two, LineBreak and Run. The one you will be missing most in Silverlight, as you are developing web-applications, is the Hyperlink-Inline. In WPF it allows you to create a hyperlink anywhere in the Text. As Silverlight doesn’t have this one, you can’t create a hyperlink inside your text out of the box. Silverlight has a HyperlinkButton, but that can’t be put inside a TextBlock. So what’s the solution? I’ve used a WrapPanel in combination with multiple TextBlocks and Hyperlinks so that it looks like the Hyperlinks are inside the Text. But in fact they aren’t, it just looks so. There are also ThirdParty-Controls available allowing you to write text that contains hyperlinks. I hope the Hyperlink-Inline will be available in Silverlight 3.0

The Second "not-so-good": The TextBlock-Element can’t justify the text it contains.

The Third "not-so-good": The Image-Element only supports jpeg and png-files. As the images in the "articles"-Section of my homepage were gif-files, I needed to convert them. Maybe in a future release of Silverlight the Image-Element supports more types. But this point isn’t really bad, it’s not a big thing to convert images.

The Fourth "not-so-good": If you set the silverlight plugin’s params windowsless to true and background to transparent, you can display a custom html-background. I tried that and set the silverlight-plugin to a width of 800. If you use such a html-background, your silverlight-content will flicker when you animate it. That’s because the plugin is in an overlay over the website. That wouldn’t change in future versions. So the golden rule is not to use animations if the plugin’s background is transparent and the plugin is windowless. Or another option is to set the plugins width and height to 100% so that you don’t see any other html-contents. The latter I’ve done.

The last "not-so-good": The Enum-class has no GetNames-Method. To loop through an enum, you’ll need reflection. I’ve done it this way, where Category is my enum:

foreach (FieldInfo fi in typeof(Category).GetFields(
  BindingFlags.Static | BindingFlags.Public))
{
  Category category =
    (Category)Enum.Parse(typeof(Category), fi.Name, true);
  ...
}

Ok, that’s all. There are also more points, e.g. Silverlight doesn’t support Triggers and Commands out of the box. But I’ll only mention those points that have been important when converting my website to Silverlight 2.

Now let’s take a look at the great things. I’ll just mention three:

The First "great one": You can use C# and common .NET classes you are already familar with. This aspect is really a big one, even if it was said already so much.

The Second "great one": With Expression Blend and Visual Studio, Animations and UI-Design can be done very fast. If you’ve some experience with WPF-Userinterfaces, you’ll do it in Silverlight the same way.

The Last "great one": As my Homepage contains a contact-formular, I needed some service to call to send an email from that formular in Silverlight. Unforetunately my webserver doesn’t understand .asmx or .svc. So I tried to call a php-script from Silverlight for sending the email. And hey, it wasn’t difficult at all. The WebClient-class in Silverlight has everything you need to make a call on a lower level to anything in the web.

So stay tuned and take a look at the Site on http://www.thomasclaudiushuber.com/pageInSilverlight

WPF "Advanced Layout"-Session at BASTA

Saturday, February 21st, 2009

Next week you can meet me at the BASTA – a German Conference about .NET, Visual Studio & more. I’ll give a presentation about Layout-functionality in WPF on Tuesday at 13.30 o’clock. After the presentation you can meet me (on Tuesday only) and other "Trivadians" (the whole week) at the "Trivadis"-stand.

I’m looking forward to see you there. :-)

Use the Network Services Shell to unblock WLANs in Windows Vista

Tuesday, February 10th, 2009

Yesterday I wasn’t able to connect to my own WLAN. The day before yesterday I was able, but yesterday I got the message that my network administrator has blocked me from connecting to this network. "Your network administrator has blocked you from connecting to this network".

blockedWLAN

The ironic thing is that I am the network administrator of this network. :-) As I hadn’t installed anything new on my machine, I wondered why my computer wasn’t able to connect anymore. Then I remembered that I got a bluescreen due to my swisscom unlimited card. My computer awaked from sleep and didn’t recognize the swisscom unlimited card anymore. I plugged-in the card again, and then I got a bluescreen. Unfortunately at this moment I was not in my home-wlan, so I didn’t recognize that it didn’t work anymore.

So the question was how to unblock this WLAN. I didn’t find any contextmenu or a Dialog to unblock it. So first I have deinstalled the software of the unlimited card. But that wasn’t a helpful idea. My WLAN was still blocked. (Normally the software of the unlimited card (called unlimited data manager) can manage your WLANs, then you’ll see them as blocked. But I didn’t tell the software to manage my WLANs, so I thought deinstalling would help, but it didn’t).

After deinstalling the unlimited card software didn’t help, I thought there’s only a way like a real admin would do – by a commandline-tool that gives you a little bit of linux-feeling.

Windows Vista contains a commandline-tool called "netsh" – the Network Services Shell. That tool was also shipped with XP and other Windows Operating Systems. Run that tool from the commandline with "netsh wlan" and you’ll see the available commands for WLANs. I looked at http://technet.microsoft.com/en-us/library/cc755301.aspx, where you’ll find all informations about administration of WLANs by netsh. There you’ll also find the "delete filter" command, that was the solution to my problem.

I’ve deleted the filters of denied infrastructure and adhoc networks by calling the following two commands in a cmd-Window with path to system32

>netsh wlan delete filter permission=denyall networktype=infrastructure
>netsh wlan delete filter permission=denyall networktype=adhoc

Both times I got the message "This filter is removed from the system successfully". Here’s the Console that shows what I’ve done.

netshDeleteFilter

After that step in the Console, my WLAN wasn’t blocked anymore and I was able to connect again… puhh, however, I’m still still wondering that there isn’t a GUI to unblock WLANs, even on a system called "Windows". ;-)

How-to deploy the Crystal Reports Basic Runtime that’s included in Visual Studio 2008

Monday, February 2nd, 2009

This week I’ve to deploy an ASP.NET application containing about 20 reports that have been created with the Crystal Reports Basic Runtime which is included in Visual Studio 2008. (By the way, the application also contains a lot of AJAX-Functionality. It uses the "AJAX Control Toolkit-based" MultiColumnDropDown that I’ve described in a previous post).

When deploying the application to a different machine than your developer-machine, the Crystal Report Basic Runtime must be deployed also. You do that by copying the necessary msi-file to the server and run it. The "necessary" .msi-file is already on your development machine and were installed with Visual Studio 2008. The .msi-files for different plattforms are located in the following paths:

Runtime | MSI-Location
(x86) C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5\CRRedist2008_x86.msi
(x64) C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5\CRRedist2008_x64.msi
(IA64)

C:\Program Files\Microsoft Visual Studio 9.0\Crystal Reports\CRRedist\IA64\CRRedist2008_ia64.msi

(the table above is contained in MSDN-documentation here)

The installation is very simple. You doesn’t need to click anything, simply run the .msi and you see the window below. Just wait until it closes.

crystalReportsBasic

There’s also the possibility to include the msi in your setup-application. For more information on that take a look at this thread in MSDN-Forums.

The PrintForm-Component in the Visual Basic Powerpack for Windows Forms

Friday, January 23rd, 2009

Did you ever wanted to print a Form without calling any native code? Well, with Windows Forms and Visual Studio 2008 this is a really simple exercise. When you design your WinForms-Application you’ll find a Tab Visual Basic PowerPacks in the Toolbox of Visual Studio 2008. In this Tab, you’ll find a component called PrintForm. Simply drop this component on your form, and you’ll find all the functionality you need. Let’s take a look at a small sample by using a very simple Windows Forms application.

The application just has a Browse-Button to browse an image from the filesystem, a PictureBox to display the image and a TextBox displaying the path to the image.

printForm_pic1

The Browse-Button does nothing more than showing an OpenFileDialog and setting the Text-Property of the TextBox to the selected file and assigning the chosen image to the Image-Property of the PictureBox.

private void btnBrowse_Click(object sender, EventArgs e)
{
  var dlg = new OpenFileDialog
    {
      Multiselect = false,
      Filter = "JPEG (*.jpg)|*.jpg|JPEG (*.jpeg)|*.jpeg"
               + "|GIF(*.gif)|*.gif|Bitmap (*.bmp)|*.bmp"
    };
  if(dlg.ShowDialog() == DialogResult.OK)
  {
    txtImagePath.Text = dlg.FileName;
    pictureBox1.Image = Image.FromFile(dlg.FileName);
  }
}

The Form above already contains a "Print Form!"-Button. The eventhandler of that Button is currently empty. Let’s implement it. But before that, go to the designer and drag’n'drop a PrintForm-component out of the Toolbox on the Form.

printForm_pic2

After dropping the PrintForm-component, you’ll find it in the Component Tray of the Windows Forms-Designer. It’s named printForm1 by default. I won’t change that here. Now let’s step to the EventHandler of the "Print Form!"-Button.

To print the form, first a PrintDialog is shown allowing the user to select a printer. Then the settings of the PrintDialog are assigned to the PrinterSettings-Property of the printForm1-component. The Print-Method on that component is called passing in the Form (this) and an Enum-Value specifying to print the full Window.

private void btnPrintForm_Click(object sender, EventArgs e)
{
  var dlg = new PrintDialog();
  if(dlg.ShowDialog()==DialogResult.OK)
  {
    printForm1.PrinterSettings = dlg.PrinterSettings;
    printForm1.Print(this, PrintForm.PrintOption.FullWindow);
  }
}

That’s all! :-) E.g. when I print into my PDFPrinter, the resulting PDF-Document will look like this:

printForm_pic3

Beside the PrinterSettings-Property the PrintForm-Component contains some more important properties . The most mentionable one is the PrintAction-Property. It’s of type PrintAction, an enum in Namespace System.Drawing.Printing. The PrintAction-enum contains three values, PrintToPrinter (the default for the PrintForm’s PrintAction-Property), PrintToFile and PrintToPreview.

So to show a preview of the Print-output, you simply need the following to lines:

printForm1.PrintAction = PrintAction.PrintToPreview;
printForm1.Print(this, PrintForm.PrintOption.FullWindow);

Replace the code in btnPrintForm_Click with the two lines above, and you’ll automatically get a preview, like shown below. But be careful. The user can print out of the Preview. If you’ve no PrinterSettings assigned to the PrinterSettings-Property of the PrintForm, the Print will be implicitly written to the users default-Printer.

printForm_pic4

So, that’s all. Get the sample here.

VisualStateManager in Silverlight

Thursday, January 22nd, 2009

Last year I’ve written a german article for the dotnet-magazine about VisualStateManager in Silverlight. As this feature will also be part of WPF 4.0, take a look at the article, which is now available on my homepage. The article is also available on the homepage of Trivadis beside many other articles focused on other IT-Topics.

So read and enjoy. :-)

The promised code example with the ASP.NET Ajax Multicolumn-Dropdown

Monday, January 19th, 2009

During the last months I was asked many times for the code of the Multcolumn-Dropdown that I’ve described in this post. I’ve just created a very small sample-application containing such a dropdown. You can download it here.

If someone of you creates a control out of that source, I would be glad to get a link to it. :-)

Thomas