Silverlight 绑定到字典中的项目

发布于 2024-11-06 04:27:00 字数 1152 浏览 1 评论 0原文

如果我将 ViewModel 定义如下:

public class MainViewModel : DynamicObject
{
    public Dictionary<string, string> Attributes { get; set; }
    public MainViewModel()
    {
        Attributes = new Dictionary<string, string>();
        Attributes["Welcome"] = "Welcome to MVVM Light";
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (Attributes.ContainsKey(binder.Name))
        {
            result = Attributes[binder.Name];             
        }
        else
            result = "";
        return true;
    }
}

在 silverlight 中,我收到以下错误:

System.Windows.Data Error: BindingExpression path error: 'Welcome' property not found on 'DictionaryBasedVM.ViewModel.MainViewModel' 'DictionaryBasedVM.ViewModel.MainViewModel' (HashCode=30542218). BindingExpression: Path='Welcome' DataItem='DictionaryBasedVM.ViewModel.MainViewModel' (HashCode=30542218); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String')..

在 WPF 中同样可以正常工作。

If I make the ViewModel definition to the following :

public class MainViewModel : DynamicObject
{
    public Dictionary<string, string> Attributes { get; set; }
    public MainViewModel()
    {
        Attributes = new Dictionary<string, string>();
        Attributes["Welcome"] = "Welcome to MVVM Light";
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        if (Attributes.ContainsKey(binder.Name))
        {
            result = Attributes[binder.Name];             
        }
        else
            result = "";
        return true;
    }
}

In silverlight I get the following error:

System.Windows.Data Error: BindingExpression path error: 'Welcome' property not found on 'DictionaryBasedVM.ViewModel.MainViewModel' 'DictionaryBasedVM.ViewModel.MainViewModel' (HashCode=30542218). BindingExpression: Path='Welcome' DataItem='DictionaryBasedVM.ViewModel.MainViewModel' (HashCode=30542218); target element is 'System.Windows.Controls.TextBlock' (Name=''); target property is 'Text' (type 'System.String')..

The same works fine in WPF.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花伊自在美 2024-11-13 04:27:00

试试这个“{绑定属性[欢迎]}”

Try this "{Binding Attributes[Welcome]}"

谁与争疯 2024-11-13 04:27:00

问题在于,DynamicObject 仅在引用由类型为 dynamic 的标识符保存时才发挥作用。

然而,Silverlight Xaml 处理适用于object 而不是dynamic,并使用反射来确定它所需的属性信息。

Oliver 指出的一种选择是使用 Silverlight 的功能来处理基于字符串的索引器。

The problem is that DynamicObject only comes into play when a reference is held by an identifier typed as dynamic.

However Silverlight Xaml processing works with object not dynamic and uses reflection to determine the property info it needs.

One option as Oliver points out is to use Silverlight's ability to work with string based indexers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文