为什么你不能在Silverlight中绑定TextDecoration?

时间:2011-08-31 15:46:31

标签: .net silverlight xaml binding

我的Silverlight .XAML定义中有2个TextBlocks。我希望第二个TextBlock模拟第一个TextBlock的行为。我发现这样做的最简单方法是通过元素数据绑定。这一切都很好,但是当我尝试绑定到TextDecoration属性时出现以下错误:

  

无法将类型为“System.Windows.Data.Binding”的对象强制转换为类型   'System.Windows.TextDecorationCollection'。

作为参考,我的XAML看起来像这样:

<TextBlock x:Name="TextBlock1" Text="Booya" />
<TextBlock x:Name="TextBlock2" Text="AnotherBooya" FontSize="{Binding FontSize, ElementName=TextBlock1}" FontFamily="{Binding FontFamily, ElementName=TextBlock1}" TextDecorations="{Binding TextDecorations, ElementName=TextBlock1}"/>

如果我删除TextDecorations =“{Binding TextDecorations,ElementName = txt_FanName}”部分,那么代码编译就好了。这是因为TextDecoration属性可以接受Null值,而其他(I.e。:FontWeight)不能接受吗?

我的问题是: 为什么会这样?是否有任何解决方法(除了在代码隐藏中手动设置它)?

2 个答案:

答案 0 :(得分:3)

这似乎是Designer中的一个错误。在运行时绑定工作正常。然而,它在设计时是一个非常混乱的错误因为设计变得无用。

我找到的一个解决方法是创建一个“身份”转换器,这是一个简单地返回未修改的输入值的转换器: -

public class IdentityConverter : IValueConverter
{

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }
}

在本地Resources节点中拥有其中一个并在绑定上使用它。例外并没有立即消失,但是运行应用程序并返回设计设计师似乎很高兴渲染,但绑定下的蓝色swiggly线仍然存在。

一旦您对整个Xaml的工作感到高兴,您就不需要进行进一步的设计,就可以删除这个kludge。

答案 1 :(得分:0)

我在我的Control的初始化代码(例如构造函数)中添加了TextDecorations的绑定,其中TextBlock位于以下位置:

//The following are because of bug in the XAML designer
Binding  binding = new Binding("fontUnderln"); // fontUnderln is a property in my DataContext
txtBlockDlgImgTiltle.SetBinding(TextBlock.TextDecorationsProperty, binding);
txtBlockDlgImgText.SetBinding(TextBlock.TextDecorationsProperty, binding);