Can I set an instance property in Javascript on a Scriptable Member property in Silverlight?

StackOverflow https://stackoverflow.com/questions/9263350

Question

I have the following (2) 'ScriptableMember' types in my Silverlight control:

<ScriptableMember()>
Public Property MType As MyCustomType

<ScriptableMember()>
Public Property Message As String

The purpose here is obviously to allow exposure via the HTML bridge in Javascript. Calling the 'Message' property is trivial and works perfectly like below:

var SLControl = document.getElementById("SilverlightControl");
SLControl.Content.MyRegisteredControl.Message = 'Hello';

However I am having trouble setting the values of an instance property by drilling down to its properties in JS. The code I would think should be as below:

SLControl.Content.MyRegisteredControl.MType.Name = 'John';

Notice how I added in the 'MType' and then accessed one of its Public Properties named 'Name'. The MyCustomType class has all the appropriate 'ScriptableMember' atributes as required.

However when that line above is ran I get the following error:

"Microsoft JScript runtime error: Object doesn't support this property or method"

It works just fine on the assignment of 'Message'. Is it possible in JS to drill down through an instance property and assign its variables? If so do I have the JS incorrect, or what do I need to do to fix this. Thanks!

Était-ce utile?

La solution

Well I didn't get any help on this one but I figured it out and the answer is 'yes'.

1st I have an instance property on my Silverlight control that looks like the following:

<ScriptableMember()>
Private _MyClass1 As New MyCustomClass
Public Property MyClass1() As MyCustomClass
 Get
   Return _MyClass1
 End Get
 Set(ByVal value As MyCustomClass)
   _MyClass1= value
 End Set
End Property

As required by the HTML bridge, register an instance of my control's class instance so I can gain access from JavaScript:

HtmlPage.RegisterScriptableObject("MySLControl", Me)

Now I thought I needed to register another member above for the instance property, but I did not not need to do that. You can drill down to it through the main class instance exposed as a scriptable member as shown below:

//Get instance of the Silverlight File Upload Control
var SLControl = document.getElementById("SilverlightControl");
if (SLControl != null)
  //Drill down through the instance property exposed on the Silverlight control
  SLControl.Content.MySLControl.MyClass1.Name = "John Smith";

The thing that threw me off was thinking I needed to register an instance of a scriptable type for the instance property, but I did not need to do that. I could just drill down and access the property.

The following post expands on this a bit more:
Accessing Instance Properties in Silverlight from JavaScript

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top