Хорошо, это то, к чему я пришел после некоторых экспериментов.
Я создал триггер Expression Blend 3 со свойством зависимости (я назвал его Subscription). Я привязываю подписку к тому же значению, к которому привязан мой TextBlock, и этот триггер присоединен к действию ControlStoryboardAction из Expression Blend 3.
Вот триггер:
public class DataTriggerPlus : TriggerBase<DependencyObject>
{
public static readonly DependencyProperty SubscriptionProperty =
DependencyProperty.Register("Subscription",
typeof(string),
typeof(DataTriggerPlus),
new FrameworkPropertyMetadata("",
new PropertyChangedCallback(OnSubscriptionChanged)));
public string Subscription
{
get { return (string)GetValue(SubscriptionProperty); }
set { SetValue(SubscriptionProperty, value); }
}
private static void OnSubscriptionChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
((DataTriggerPlus)d).InvokeActions(null);
}
}
Вот как оно прикреплено к раскадровке:
<TextBlock x:Name="textBlock" Text="{Binding TestProp}" Background="White">
<i:Interaction.Triggers>
<local:DataTriggerPlus Subscription="{Binding TestProp}">
<im:ControlStoryboardAction
Storyboard="{StaticResource Storyboard1}"/>
</local:DataTriggerPlus>
</i:Interaction.Triggers>
</TextBlock>
Мне очень нравится этот подход, отличная работа дизайнеров Blend 3!
Редактировать: отвечая на комментарий Дрю ...
Да, он поставляется с Blend. Вы можете просто включить Microsoft.Expression.Interactions.dll и System.Windows.Interactivity в ваш проект.
И да, это многословно (я спросил, нашел ли кто-нибудь хороший способ применить поведение с помощью стилей в этом вопросе ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие из того же триггера.