宣告一個ColumnSetting類別,其中特別設一個列舉(ColumnTypeEnum)觀察它的傳換結果。另外,宣告兩個函數: SL2JS()傳回ColumnSetting,JS2SL(ColumnSetting)傳入ColumnSetting當參數。
//欄位型別列舉
public enum ColumnTypeEnum
{
TextBox, NumericTextBox,
ComboBox, Checkbox, DatePicker
}
//記得要加註ScritableType, 要用Property不能用Field
[ScriptableType]
public class ColumnSetting
{
public string Name { get; set; }
public ColumnTypeEnum ColumnType { get; set; }
public int Width { get; set; }
public ScriptObject OnCellEdit { get; set; }
}
//傳ColumnSetting到JS端,注意ColumnType傳的是其整數值
[ScriptableMember]
public ColumnSetting SL2JS()
{
ColumnSetting cs = new ColumnSetting()
{
Name = "Amount",
ColumnType = ColumnTypeEnum.NumericTextBox,
Width = 100
};
return cs;
}
[ScriptableMember]
public void JS2SL(ColumnSetting cs)
{
if (IsFunction(cs.OnCellEdit))
cs.OnCellEdit.InvokeSelf("Callback");
MessageBox.Show(cs.Width.ToString());
}
function onSilverlightLoad(sender, args) {
var slCtl = sender.getHost();
var jssk = slCtl.Content.JavascriptSidekick;
alert(cs.ColumnType); //enum,會傳回其值=1
alert(cs["Width"]); //用[colName]也成
sb.push(p + "->" + cs[p]);
//故無法用for (var p in csRefTest)列舉,
//IE:sb.length=0 FF:Error
cs.OnCellEdit = function(s) {
那我們可不可以從{ Name:"...", ColumnType:.. }自已捏一個Javascritp物件轉型成ColumnSetting呢? 答案是不行! 即使所有屬性取的名字一模一樣,Javascript物件無法直接轉型成Managed Type。
//改用JS端從無到有建立物件
var jscs = {
Name:"UnitPrice", ColumnType:1, Width:300 };
jssk.JSD2SL(jscs);
//以上的寫法是行不通的,會發生轉型錯誤
//This object cannot be converted to the specified type
//'JsInterop.JavascriptSidekick+ColumnSetting'.
//要建立可當參數傳入的Managed Object,改用createManagedObject()
jscs = jssk.createManagedObject("ColumnSetting");
jscs.Name="UnitPrice";
jscs.ColumnType=1;
jscs.Width=365;
jssk.JS2SL(jscs);