如何从JavaScript中循环遍历Silverlight字典?

3

我正在尝试从JavaScript访问Silverlight字典。 如此处所述, Silverlight为可以通过JavaScript访问的字典类型创建了包装器。

function MyFunction(dictionary)
{
    // This works okay...
    alert(dictionary["someKey"]);
}

然而,在我的情况下,我不知道字典中实际包含哪些键。然而,MSDN页面似乎没有描述任何访问此信息的方法。我已经尝试过:

function MyFunction(dictionary)
{
    for (var item in dictionary)
    {
        // Do stuff
        alert(item);
    }
}

然而,这并不起作用。我还尝试使用为数组定义的属性和方法,例如 lengthtoArray()。我尝试猜测一个 keys 属性。毫无疑问,它们都不起作用。

这是 Silverlight 公开的包装器中的一个重大疏忽,还是我漏掉了什么?最好的替代方案是什么?

为了完整起见,Silverlight 代码并不是非常有趣,但看起来像这样:

void MyMethod(IDictionary<string, string> dictionary)
{
    jsObjectDefiningMyFunction.MyFunction(dictionary);
}
2个回答

4
IDictionary包装器看起来像一个普通的JavaScript对象(您可以像object["key"]object.key一样访问属性),但从文档中可以看出它仅支持使用已知键的getter/setter(而不是迭代)。
我建议在您的JavaScript函数中添加另一个参数,只是字典键的数组或列表,然后您可以在JavaScript端进行迭代,即。
string[] keys = new string[dictionary.Keys.Count];
dictionary.Keys.CopyTo(keys,0);
jsObjectDefiningMyFunction.MyFunction(dictionary, keys);

这些键将使用一个数组包装器来转换,可以使用长度和例如myVar[3]在javascript端进行迭代。


只需将键作为 dictionary.Keys.ToArray() 传递即可。 - Bryant
Silverlight 在 KeyCollection 上似乎不支持 ToArray() 方法。 - jayarjo

1

你没有错过任何东西。Javascript的for..in特性不是COM对象支持的功能(这将是包装器的基本功能)。我可以想象,从Silverlight实现这个功能可能会相当棘手。

替代方案取决于你的Javascript代码真正需要做什么。以下是一种方法,创建一个标准的javascript对象,其中for..in将起作用:

        ScriptObject o = HtmlPage.Window.CreateInstance("Object");
        foreach (var kvp in dictionary)
        {
            o.SetProperty(kvp.Key, kvp.Value);
        } 

        jsObjectDefiningMyFunction.MyFunction(o);

然而,我怀疑在大多数情况下,这是一种非常低效的方法,但确实取决于JavaScript使用场景。例如,这对于构建要传递给许多JQuery方法的对象非常完美。另一方面,如果偶尔需要查找单个项目的当前值并且需要更新该值,则此方法非常糟糕。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接