это зависит, если Ваш язык и код продвигают: LBYL (взгляд перед прыганием) или EAFP (легче спросить прощение, чем разрешение)
LBYL заявляет, что необходимо проверить на значения (так возвратите пустой указатель)
EAFP заявляет, чтобы просто попробовать операцию и видеть, перестало ли это работать (выдайте исключение)
, хотя я соглашаюсь с вышеупомянутым.. исключения должны использоваться для исключительных / состояний ошибки, и возврат пустого указателя является лучшим при использовании проверок.
EAFP по сравнению с LBYL в Python:
http://mail.python.org/pipermail/python-list/2003-May/205182.html ( веб-Архив )
Хорошо, вот к чему я пришел после некоторых экспериментов.
Я создал триггер Expression Blend 3 со свойством зависимости (я назвал его подпиской). Я привязываю подписку к тому же значению, к которому привязан мой 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>
I мне очень нравится этот подход, отличная работа, дизайнеры Blend 3!
Edit: ответ на комментарий Дрю ...
Да, он поставляется с Blend. Вы можете просто включить Microsoft.Expression.Interactions.dll и System.Windows.Interactivity в свой проект.
И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применения поведения с помощью стилей в этот вопрос ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.
s как это прикреплено к раскадровке:<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!
Edit: ответ на комментарий Дрю ...
Да, он поставляется с Blend. Вы можете просто включить Microsoft.Expression.Interactions.dll и System.Windows.Interactivity в свой проект.
И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применить поведение с помощью стилей в этот вопрос ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.
s как это прикреплено к раскадровке:<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!
Edit: ответ на комментарий Дрю ...
Да, он поставляется с Blend. Вы можете просто включить Microsoft.Expression.Interactions.dll и System.Windows.Interactivity в свой проект.
И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применить поведение с помощью стилей в этот вопрос ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.
И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применения поведения с помощью стилей в этом вопросе ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.
И да, это многословно (я спросил, придумал ли кто-нибудь хороший способ применения поведения с помощью стилей в этом вопросе ) - но есть и преимущество гибкости. Например, вы можете не только запустить раскадровку, но и переключить состояние или выполнить какое-либо другое действие с того же триггера.
Вы можете создать триггер, который будет запускать анимацию.
Примерно так:
<Style>
<Style.Triggers>
<Trigger
Property="ViewModelProperty"
Value="True">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="YourStoryBoard" />
</Trigger.EnterActions>
</Trigger>
</Style.Triggers>
</Style>
Что касается проблемы с установкой значения после завершения анимации, это немного боли. Насколько мне известно, вам нужно будет использовать завершенное событие в раскадровке, для этого потребуется код позади, чего вы хотите избежать с помощью MVVM.
Я пробовал использовать EventTriggers для привязки к завершенным событиям , но это также вызывает некоторые сложности. Подробнее см. здесь .