绑定到Silverlight中的非依赖项对象

时间:2014-05-22 15:47:32

标签: c# silverlight-5.0

我在xaml中有一个声明如下:

<my:CMIconText Icon="Attachment" Text="Logo" />

其中CMIconText是来自abc.Core.dll的类,Text是该类中的字符串属性。

我想使用Staticbinding绑定Text但是&#34; Text&#34;不是依赖属性我无法这样做。问题是我无法将其作为依赖属性,因为abc.Core.dll正被多个其他项目使用。

还有其他选择,如果不更改dll,我可以绑定属性吗?

谢谢,

阿卜迪

2 个答案:

答案 0 :(得分:0)

您可以在对象上使用Attached Dependency Property来观察绑定并将值静态传递给您的CMIconText对象。使用OneWay绑定可以更好地工作,但它可以用于双向绑定。

public class TextBoxExtension
{
    public static readonly DependencyProperty AttachedTextProperty;

    static TextBoxExtension()
    {
        AttachedTextProperty = DependencyProperty.RegisterAttached("AttachedText", typeof (string), typeof (TextBoxExtension), new PropertyMetadata(default(string), TextAttachedChanged));
    }

    public static string GetAttachedText(TextBox sender)
    {
        return (string) sender.GetValue(AttachedTextProperty);
    }

    public static void SetAttachedText(TextBox sender, string value)
    {
        sender.SetValue(AttachedTextProperty, value);
    }

    private static void TextAttachedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        ((TextBox) sender).Text = e.NewValue as string;
    }
}

这将允许您在XAML中执行此操作:

<TextBox Grid.Row="0" Grid.Column="1" controls:TextBoxExtension.AttachedText="{Binding Name}" />

这比重新实现全班更简单。当然,您需要将TextBox的引用更改为您自己的对象。但是因为我没有它,所以我能给你一个最近的例子。

答案 1 :(得分:0)

我会创建一个单独的类类似的属性和行为,但需要依赖属性。您可能希望扩展CMIconText(特别是如果您可以覆盖Text属性以提供新的实现;即使将基本属性更改为DP也没有意义,也许您可以将其修改为virtual)。如果不能将基础Text设为virtual,我会避免扩展课程。在这种情况下,我会使用适当的方法(或AutoMapper)将类转换为/ CMIconText

public class SilverlightCMIconText : CMIconText
{
    public override string Text
    {
        get { ... }
        set { ... }
    }
}
<local:SilverlightCMIconText Icon="Attachment" Text="{StaticResource Whatev}" />