Thursday, May 13, 2010

Sử dụng Bing Maps trong Silverlight

Việc sử dụng Bing Maps control trong các ứng dụng Silverlight rất đơn giản, bời vì Microsoft đã cung cấp cho chúng ta Bing Maps Silverlight Control SDK và bởi vì Silverlight là client-side, nên các truy vấn vào Bing Maps sẽ thông qua Bing Maps Web Services SDK.

Trước khi bắt đầu việc phát triển ứng dụng Bing Maps Silverlight, bạn phải cài đặt các thành phần sau:

Microsoft Visual Studio 2008 SP1

Microsoft Silverlight 3 Tools for Visual Studio 2008 SP1

Trong bài viết này, tôi sẽ làm từng bước để bạn có thể sử dụng được Bing Maps trong Silverlight:

Tạo Bings Maps Key

1. Bạn hãy download Bing Maps Sỉverlight Control từ đây và tiến hành cài đặt.

2. Tạo Bing Maps Developer account:

Sử dụng Bing Maps Silverlight Control

1. Tạo ứng dụng Silverlight trong Visual Studio

2. Hãy reference đến Microsoft.Maps.MapControl.dll và Microsoft.Maps.MapControl.Common.dll có trong thư mục C:\Program Files\Bing Maps Silverlight Control\V1\Libraries.

3. Open MainPage.xml và thêm tham chiếu đến Bing Maps control như sau:

xmlns:maps="clr-namespace:Microsoft.Maps.MapControl;assembly=Microsoft.Maps.MapControl"

4. Tiếp theo, bạn hãy đưa Bing Maps control vào:

<Grid x:Name="LayoutRoot">
	<maps:Map x:Name="myMap" CredentialsProvider="[Bing Maps Key]" />
</Grid>

Chú ý: [Bing Map Key] chính là key đã được cung cấp bởi Bing Maps Portal ở trên.

5. Khi chạy thử ứng dụng, bạn sẽ có kết quả như sau:

BingMapsSample1

Như vậy, bạn đã có thể sử dụng được Bing Maps trong Silverlight, ở bài tiếp theo, tôi sẽ nói về việc sử dụng Bing Maps Web Services SDK để truy vấn các thông tin và hiển thị lên Bing Maps controls.

Friday, March 5, 2010

How to EndEdit before changes can be submitted with Entity Ria Service

In my application, i am using Silverlight, Prism and WCF Ria Service, when user ended edit a cell, value changes will be saved to server.

In the View, i used SelectedItem binding to track change of the entity:

<telerikGridView:RadGridView
    ItemsSource="{Binding Departments}"
    SelectedItem="{Binding Department, Mode=TwoWay}"
    ...
    >
</telerikGridView:RadGridView>

In the ViewModel, that is

public DepartmentEntity Department
{
	get { return department;}
	set { 
		department = value; 
        FirePropertyChanged("Department");
		
		if (department != value)
		{
			department.PropertyChanged += department_PropertyChanged;
		}
	}
}

void department_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
	if (e.PropertyName == "HasChanges" && !context.IsSubmitting)
    {
        context.SubmitChanges();
	}
}

After i change value in a Cell of RadGridView, the following exception is thrown:

Entity 'DepartmentEntity : 1' is currently being edited and has uncommitted changes. A call to BeginEdit must be followed by a call to EndEdit or CancelEdit before changes can be submitted.

The solution:

Before context.SubmitChanges(), i inserted the following code lines:

IEditableObject editableObject = departmentEntity as IEditableObject;
editableObject.EndEdit();

context.SubmitChanges();

Now, the method for entity property changed is:

void department_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
	if (e.PropertyName == "HasChanges" && !context.IsSubmitting)
    	{
		IEditableObject editableObject = ecranSelected as IEditableObject;
	        editableObject.EndEdit();

	        context.SubmitChanges();
	}
}
And my application work fine.

Saturday, January 30, 2010

Enabling cross-domain calls for Silverlight apps on WCF

The problem

In my Silverlight application, it try to call a WCF web service hosted on the web server (IIS). When i run the Silverlight application, the follow exception was obtain:
“An error occurred while trying to make a request to URI 'http://myserver/myservicehost/service1.svc'. This could be due to attempting to access a service in a cross-domain way without a proper cross-domain policy in place, or a policy that is unsuitable for SOAP services. You may need to contact the owner of the service to publish a cross-domain policy file and to ensure it allows SOAP-related HTTP headers to be sent. This error may also be caused by using internal types in the web service proxy without using the InternalsVisibleToAttribute attribute. Please see the inner exception for more details.”

Resolve

Create follow two xml files and add into C:\inetpub\wwwroot folder.
ClientAccessPolicy.xml
<?xml version="1.0" encoding="utf-8"?>

 
  
   
    
   
   
    
   
  
 

CrossDomain.xml

 
 

Notice: You have to restart IIS and redeploy WCF service before using in Silverlight.