Проблема, как представляется, 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 найти более легкий путь.
Это одна из вещей, которые я с нетерпением жду в Silverlight 3. – 2009-04-29 14:55:16