我可以将 silverlight 控件绑定到 DynamicObject.Properties 吗?

发布于 2024-12-04 07:30:38 字数 1224 浏览 0 评论 0原文

我有一个 DynamicObject 类,它绑定到 silverlight xaml 中的一些控件。

class Localizer
{
    public Strings Strings { get; set; }
}

public class Strings : DynamicObject
{
    Dictionary<string, string> values;

    public Strings(Dictionary<string, string> values)
    {
        this.values = values;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        string value;
        bool success = values.TryGetValue(binder.Name, out value);
        result = value;
        return success;
    }
}

并将一些控件绑定到此,如下所示:

<TextBlock Text="{Binding Strings.User, Source={StaticResource Localizer}}"/>

当我运行应用程序时,我在 VS 输出中收到此错误:

System.Windows.Data 错误:BindingExpression 路径错误:在 '....Localization.StringsResource' 上找不到 'Login' 属性....Localization.StringsResource' (HashCode=10857028)。 BindingExpression: Path='Strings.Login' DataItem='....Localization.Localizer' (HashCode=30604389);目标元素是“System.Windows.Controls.Button”(名称=“btnLogin”);目标属性是“Content”(类型“System.Object”)。

但是当在这样的代码中读取属性时:

string UserName = localizer.Strings.Login;

它工作正常,是否可以将控件绑定到 xaml 中的 DynamicObject?

I have a DynamicObject class that is binded to some controls in silverlight xaml.

class Localizer
{
    public Strings Strings { get; set; }
}

public class Strings : DynamicObject
{
    Dictionary<string, string> values;

    public Strings(Dictionary<string, string> values)
    {
        this.values = values;
    }

    public override bool TryGetMember(GetMemberBinder binder, out object result)
    {
        string value;
        bool success = values.TryGetValue(binder.Name, out value);
        result = value;
        return success;
    }
}

and bind some controls to this like this:

<TextBlock Text="{Binding Strings.User, Source={StaticResource Localizer}}"/>

When I run the application I get this error in VS output:

System.Windows.Data Error: BindingExpression path error: 'Login' property not found on '....Localization.StringsResource' '....Localization.StringsResource' (HashCode=10857028). BindingExpression: Path='Strings.Login' DataItem='....Localization.Localizer' (HashCode=30604389); target element is 'System.Windows.Controls.Button' (Name='btnLogin'); target property is 'Content' (type 'System.Object').

but when read property in code like this:

string UserName = localizer.Strings.Login;

It work correctly, is it possible to bind controls to DynamicObject in xaml?

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

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

发布评论

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

评论(2

萧瑟寒风 2024-12-11 07:30:38

不幸的是,这是 silverlight 中的一个错误,:(
与动态对象的数据绑定已损坏

Unfortunately this is a bug in silverlight, :(
Databinding to Dynamic Objects is Broken

逐鹿 2024-12-11 07:30:38

在 Silverlight 4 中,您无法对属性进行数据绑定,但可以对索引器进行数据绑定。由于我假设您不支持 Strings 对象中的实时数据更改,因为它不支持 INotifiyPropertyChanged 您可以只返回字典并使用索引器绑定语法。

但如果您确实需要支持 INotifiyPropertyChanged,silverlight 具有用于通知特定索引器值更改的语法 new PropertyChangedEventArgs("Item["+key+"]"),您可以在 Strings 对象中使用它。

Silverlight 5 可能有一个简单的 解决方法,还是一个困难的方法,目前还很难说。

In Silverlight 4, you can't data bind properties, but you can data bind indexers. Since I assume you aren't supporting live data changes in that your Strings object, as it doesn't support INotifiyPropertyChanged you could just return the dictionary and use the indexer binding syntax.

But if you did need to support INotifiyPropertyChanged, silverlight has syntax for notifying changes of specific indexer values new PropertyChangedEventArgs("Item["+key+"]") that you could use in the Strings object.

Silverlight 5 may have a easy workaround, or a difficult one, it's hard to say at this point.

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