×
Namespaces

Variants
Actions
(Difference between revisions)

How to debug data binding problems on Windows Phone

From Nokia Developer Wiki
Jump to: navigation, search
hamishwillee (Talk | contribs)
hamishwillee (Talk | contribs)
m (Hamishwillee -)
 
(14 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[[Category:Windows Phone]][[Category:Silverlight]][[Category:Debugging]][[Category:Files/Data]]
+
[[Category:Files/Data on Windows Phone]][[Category:Debugging on Windows Phone]][[Category:Code Examples]][[Category:XAML]][[Category:Windows Phone 7.5]][[Category:Windows Phone 8]]
{{Abstract|This article explains how you can debug data binding issues by inspecting the elements before they are due to be displayed by the control.}}
+
{{Abstract|This article explains how to debug data binding issues by inspecting the elements before they are due to be displayed by the control.}}
  
 
{{ArticleMetaData <!-- v1.2 -->
 
{{ArticleMetaData <!-- v1.2 -->
Line 7: Line 7:
 
|devices= <!-- Devices tested against - e.g. ''devices=Nokia 6131 NFC, Nokia C7-00'') -->
 
|devices= <!-- Devices tested against - e.g. ''devices=Nokia 6131 NFC, Nokia C7-00'') -->
 
|sdk= <!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Qt SDK 1.1.4]) -->
 
|sdk= <!-- SDK(s) built and tested against (e.g. [http://linktosdkdownload/ Qt SDK 1.1.4]) -->
|platform= <!-- Compatible platforms - e.g. Symbian^1 and later, Qt 4.6 and later -->
+
|platform= Windows Phone 7.5
 
|devicecompatability= <!-- Compatible devices e.g.: All* (must have internal GPS) -->
 
|devicecompatability= <!-- Compatible devices e.g.: All* (must have internal GPS) -->
 
|dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 -->
 
|dependencies= <!-- Any other/external dependencies e.g.: Google Maps Api v1.0 -->
 
|signing= <!-- Signing requirements - empty or one of: Self-Signed, DevCert, Manufacturer -->
 
|signing= <!-- Signing requirements - empty or one of: Self-Signed, DevCert, Manufacturer -->
 
|capabilities= <!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. -->
 
|capabilities= <!-- Capabilities required by the article/code example (e.g. Location, NetworkServices. -->
|keywords= <!-- APIs, classes and methods (e.g. QSystemScreenSaver, QList, CBase -->
+
|keywords= IValueConverter, data binding, xaml
 
|language= <!-- Language category code for non-English topics - e.g. Lang-Chinese -->
 
|language= <!-- Language category code for non-English topics - e.g. Lang-Chinese -->
 
|translated-by= <!-- [[User:XXXX]] -->
 
|translated-by= <!-- [[User:XXXX]] -->
Line 26: Line 26:
  
 
== Introduction ==
 
== Introduction ==
[http://msdn.microsoft.com/en-us/library/ms752347.aspx Data binding] allows you to link a data source defined in code to a UI description in XAML (target). While defining a binding is quite straightforward, if something does go wrong it is useful to be able to tell whether the problem is in your source data or in the binding definition.
+
[http://msdn.microsoft.com/en-us/library/ms752347.aspx Data binding] allows you to link a data source defined in code to a UI description in XAML (target). While defining a binding is quite straightforward, if something goes wrong it is useful to be able to tell whether the problem is in your source data or in the binding definition.
  
 
The easiest way to do this is to create a custom value converter ([http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx IValueConverter]), which will be called when the data from the binding source arrives - before it gets delivered to the control. By setting a breakpoint in the converter you can confirm that the source is sending the expected data and contains the correct properties.
 
The easiest way to do this is to create a custom value converter ([http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx IValueConverter]), which will be called when the data from the binding source arrives - before it gets delivered to the control. By setting a breakpoint in the converter you can confirm that the source is sending the expected data and contains the correct properties.
  
{{Tip|If the converter doesn't get called then this is a sign that the binding has failed earlier than expected, perhaps in the definition of the source property.}}
+
{{Tip|If the converter doesn't get called then this is a sign that the binding has failed earlier than expected, perhaps in the definition of the source property or an incorrect DataContext. If a wrong property name in the binding declaration is given a message in the debug output window of VS appears. }}
  
== Worked example ==
+
 
 +
== Steps to do ==
  
 
First, consider the case where you have a {{Icode|ListBox}} definition in XAML as shown below:
 
First, consider the case where you have a {{Icode|ListBox}} definition in XAML as shown below:
Line 52: Line 53:
 
public class DatabindingDebugConverter : IValueConverter
 
public class DatabindingDebugConverter : IValueConverter
 
   {
 
   {
   public object Convert(object value, Type targetType, object parameter, string language)
+
   public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 
     {
 
     {
 
     return value;
 
     return value;
 
     }
 
     }
  
   public object ConvertBack(object value, Type targetType, object parameter, string language)
+
   public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 
     {
 
     {
 
     return value;
 
     return value;
Line 67: Line 68:
 
<code xml>
 
<code xml>
 
<phone:PhoneApplicationPage.Resources>
 
<phone:PhoneApplicationPage.Resources>
   <local:DataBindingDebugConverter x:Key="DatabindingDebugConverter"/>
+
   <local:DatabindingDebugConverter x:Key="DatabindingDebugConverter"/>
 
</phone:PhoneApplicationPage.Resources>
 
</phone:PhoneApplicationPage.Resources>
 
</code>
 
</code>
Line 83: Line 84:
  
 
== Sample code ==
 
== Sample code ==
The sample code for the [[How to encrypt your application data in Windows Phone]] article uses this technique.
+
The sample code for the [[How to encrypt your application data in Windows Phone]] article uses this technique. Or you can load the source code directly from [[Media:EncryptionSample.zip|here]].
 
{{VersionHint|Versions will be visible from this template when viewed in preview. You can delete this or leave it in the page as it is not displayed in final version}}
 
{{VersionHint|Versions will be visible from this template when viewed in preview. You can delete this or leave it in the page as it is not displayed in final version}}
 +
 +
<!-- Translation --> [[zh-hans:如何在Windows Phone手机上调试Data Binding问题]]

Latest revision as of 09:39, 28 June 2013

This article explains how to debug data binding issues by inspecting the elements before they are due to be displayed by the control.

WP Metro Icon File.png
WP Metro Icon Bug.png
SignpostIcon XAML 40.png
WP Metro Icon WP8.png
SignpostIcon WP7 70px.png
Article Metadata
Compatibility
Platform(s): Windows Phone 7.5
Windows Phone 8
Windows Phone 7.5
Article
Keywords: IValueConverter, data binding, xaml
Created: influencer (12 Oct 2012)
Last edited: hamishwillee (28 Jun 2013)

Contents

[edit] Introduction

Data binding allows you to link a data source defined in code to a UI description in XAML (target). While defining a binding is quite straightforward, if something goes wrong it is useful to be able to tell whether the problem is in your source data or in the binding definition.

The easiest way to do this is to create a custom value converter (IValueConverter), which will be called when the data from the binding source arrives - before it gets delivered to the control. By setting a breakpoint in the converter you can confirm that the source is sending the expected data and contains the correct properties.

Tip.pngTip: If the converter doesn't get called then this is a sign that the binding has failed earlier than expected, perhaps in the definition of the source property or an incorrect DataContext. If a wrong property name in the binding declaration is given a message in the debug output window of VS appears.


[edit] Steps to do

First, consider the case where you have a ListBox definition in XAML as shown below:

<ListBox x:Name="MainListBox" Margin="0,0,-12,0" ItemsSource="{Binding Items}" SelectionChanged="MainListBox_SelectionChanged">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="0,0,0,17" Width="432" Height="78">
<TextBlock Text="{Binding LineOne}" TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>
<TextBlock Text="{Binding LineTwo}" TextWrapping="Wrap" Margin="12,-6,12,0" Style="{StaticResource PhoneTextSubtleStyle}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

To implement the converter you first have to derive a class from IValueConverter and implement it's methods:

public class DatabindingDebugConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
 
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
}

Then you have to declare the converter as a static resource in your page's XAML:

<phone:PhoneApplicationPage.Resources>
<local:DatabindingDebugConverter x:Key="DatabindingDebugConverter"/>
</phone:PhoneApplicationPage.Resources>

You also have to change the XAML data binding statement to call the converter for a particular binding:

<TextBlock Text="{Binding LineOne, Converter={StaticResource DataBindingDebugConverter}}" 
TextWrapping="Wrap" Style="{StaticResource PhoneTextExtraLargeStyle}"/>

Note that this assumes you have declared the local namespace in the page tag:

xmlns:local="clr-namespace:EncryptionSample"

Next you set a breakpoint in the Convert() method and voilà, you can see the values that arrive from binding, if any.

[edit] Sample code

The sample code for the How to encrypt your application data in Windows Phone article uses this technique. Or you can load the source code directly from here.

[edit] Version Hint

Windows Phone: [[Category:Windows Phone]]
[[Category:Windows Phone 7.5]]
[[Category:Windows Phone 8]]

Nokia Asha: [[Category:Nokia Asha]]
[[Category:Nokia Asha Platform 1.0]]

Series 40: [[Category:Series 40]]
[[Category:Series 40 1st Edition]] [[Category:Series 40 2nd Edition]]
[[Category:Series 40 3rd Edition (initial release)]] [[Category:Series 40 3rd Edition FP1]] [[Category:Series 40 3rd Edition FP2]]
[[Category:Series 40 5th Edition (initial release)]] [[Category:Series 40 5th Edition FP1]]
[[Category:Series 40 6th Edition (initial release)]] [[Category:Series 40 6th Edition FP1]] [[Category:Series 40 Developer Platform 1.0]] [[Category:Series 40 Developer Platform 1.1]] [[Category:Series 40 Developer Platform 2.0]]

Symbian: [[Category:Symbian]]
[[Category:S60 1st Edition]] [[Category:S60 2nd Edition (initial release)]] [[Category:S60 2nd Edition FP1]] [[Category:S60 2nd Edition FP2]] [[Category:S60 2nd Edition FP3]]
[[Category:S60 3rd Edition (initial release)]] [[Category:S60 3rd Edition FP1]] [[Category:S60 3rd Edition FP2]]
[[Category:S60 5th Edition]]
[[Category:Symbian^3]] [[Category:Symbian Anna]] [[Category:Nokia Belle]]

This page was last modified on 28 June 2013, at 09:39.
358 page views in the last 30 days.
×