2008-11-13 4 views
1

Я работаю над созданием облака тегов в Silverlight 2 и пытаюсь связать данные из коллекции List с преобразованием масштаба в TextBlock. При запуске я получаю ошибку AG_E_PARSER_BAD_PROPERTY_VALUE. Возможно ли преобразовать значения привязки данных в Silverlight 2? Если бы я не смог что-то сделать с эффектом FontSize = {Binding Weight * 18}, чтобы умножить вес тега на базовый размер шрифта? Я знаю, что это не сработает, но каков наилучший способ вычисления значений свойств для элементов в DataTemplate?silverlight 2 привязки данных к преобразованиям?

<DataTemplate> 
<TextBlock HorizontalAlignment="Stretch" VerticalAlignment="Stretch" TextWrapping="Wrap" d:IsStaticText="False" Text="{Binding Path=Text}" Foreground="#FF1151A8" FontSize="18" UseLayoutRounding="False" Margin="4,4,4,4" RenderTransformOrigin="0.5,0.5"> 
<TextBlock.RenderTransform> 
    <TransformGroup> 
     <ScaleTransform ScaleX="{Binding Path=WeightPlusOne}" ScaleY="{Binding Path=WeightPlusOne}"/> 
    </TransformGroup> 
</TextBlock.RenderTransform> 

+0

Это одна из вещей, которые я с нетерпением жду в Silverlight 3. – 2009-04-29 14:55:16

ответ

0

Проблема, как представляется, Rule #1 from this post:

Цель связывания данных должны быть FrameworkElement.

Так как ScaleTransform не является элементом FrameworkElement, он не поддерживает привязку. Я попытался связать SolidColorBrush, чтобы проверить это и получил ту же ошибку, что и в ScaleTransform.

Чтобы обойти это, вы можете создать элемент управления, который предоставляет свойство зависимостей вашего типа данных тега. Затем добавьте свойство измененное событие, которое связывает свойства данных вашего тега с свойствами в элементе управления (одним из которых будет преобразование шкалы). Вот код, который я использовал для проверки этого.

элементы управления:

<ItemsControl x:Name="items"> 
    <ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <local:TagControl TagData="{Binding}" /> 
    </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

тег управления XAML:

<UserControl x:Class="SilverlightTesting.TagControl" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    > 
    <TextBlock x:Name="text" TextWrapping="Wrap" FontSize="18" Margin="4,4,4,4"> 
     <TextBlock.RenderTransform> 
      <ScaleTransform x:Name="scaleTx" /> 
     </TextBlock.RenderTransform> 
    </TextBlock> 
</UserControl> 

управления тег код:

public partial class TagControl : UserControl 
{ 
    public TagControl() 
    { 
     InitializeComponent(); 
    } 

    public Tag TagData 
    { 
     get { return (Tag)GetValue(TagDataProperty); } 
     set { SetValue(TagDataProperty, value); } 
    } 

    // Using a DependencyProperty as the backing store for TagData. This enables animation, styling, binding, etc... 
    public static readonly DependencyProperty TagDataProperty = 
     DependencyProperty.Register("TagData", typeof(Tag), typeof(TagControl), new PropertyMetadata(new PropertyChangedCallback(TagControl.OnTagDataPropertyChanged))); 

    public static void OnTagDataPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
    { 
     var tc = obj as TagControl; 
     if (tc != null) tc.UpdateTagData(); 
    } 

    public void UpdateTagData() 
    { 
     text.Text = TagData.Title; 
     scaleTx.ScaleX = scaleTx.ScaleY = TagData.Weight; 
     this.InvalidateMeasure(); 
    } 

} 

кажется излишним для просто установив одно свойство, но я не мог» t найти более легкий путь.

Смежные вопросы