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

时间:2011-09-14 13:22:13

标签: silverlight binding dynamic

我有一个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); target元素是'System.Windows.Controls.Button'(Name ='btnLogin'); target属性是'Content'(类型'System.Object')。

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

string UserName = localizer.Strings.Login;

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

Silverlight 5可能有一个简单的workaround,或者很难,但现在很难说。