【问题标题】:Can I bind silverlight controls to DynamicObject.Properties?我可以将 silverlight 控件绑定到 DynamicObject.Properties 吗?
【发布时间】:2011-11-17 00:51:12
【问题描述】:

我有一个 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”“....Localization.StringsResource”上找不到“Login”属性(HashCode=10857028)。 BindingExpression: Path='Strings.Login' DataItem='....Localization.Localizer' (HashCode=30604389);目标元素是'System.Windows.Controls.Button'(名称='btnLogin');目标属性是“内容”(类型“System.Object”)。

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

string UserName = localizer.Strings.Login;

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

【问题讨论】:

    标签: silverlight binding dynamic


    【解决方案1】:

    不幸的是,这是 silverlight 中的一个错误,:(
    Databinding to Dynamic Objects is Broken

    【讨论】:

      【解决方案2】:

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

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

      Silverlight 5 可能有一个简单的workaround,也可能是一个困难的,目前很难说。

      【讨论】:

        猜你喜欢
        • 2012-08-28
        • 1970-01-01
        • 1970-01-01
        • 2012-07-23
        • 2011-05-11
        • 1970-01-01
        • 2018-09-04
        • 1970-01-01
        • 2010-10-29
        相关资源
        最近更新 更多