Silverlight 2 привязки данных для преобразования? - PullRequest
1 голос
/ 13 ноября 2008

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

<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>

1 Ответ

0 голосов
/ 13 ноября 2008

Похоже, проблема Правило № 1 из этого поста :

Целью привязки данных должен быть 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();
    }

}

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

...