簡體   English   中英

動畫完成后,從XAML中的情節提要中更改MVVM屬性

[英]Change MVVM property from storyboard in XAML, after animation completes

我將不同的用戶控件定義為ListView的ItemSource DataTemplates,它們都共享一個ViewModel:

<UserControl>
  <Grid>
    <Style>
      <Style.Triggers>
        <DataTrigger Binding="{Binding MyAwesomeProperty}" Value="True">
          <DataTrigger.EnterActions>
            <BeginStoryboard>
              <Storyboard>
                <DoubleAnimation>
                 some awesome animation
                </DoubleAnimation>
              </Storyboard>
            </BeginStoryboard>
          </DataTrigger.EnterActions>
        </DataTrigger>
    </Style.Triggers>
</Style>
public class AwesomeViewModel : ViewModelBase
{
    private bool myAwesomeProperty= false;
    public bool MyAwesomeProperty
    {
        get { return myAwesomeProperty; }

        set
        {
            if (myAwesomeProperty!= value)
            {
                myAwesomeProperty= value;
                RaisePropertyChanged(() => MyAwesomeProperty);
            }
        }
    }
}

現在,我想在MyAwesomeProperty更改為true時開始動畫。 這是由DataTrigger完成的。 但是,一旦動畫完成,我想將MyAwesomeProperty的值設置回false。

由於此邏輯由具有相同ViewModel的多個UserControl共享,因此我需要純MVVM解決方案,而在背后的代碼中沒有Animation.Completed回調。 這可能嗎?

這是使用Blend的交互庫的解決方案

首先,右鍵單擊項目中的“ 引用” ,單擊“ 添加引用”,然后在“ 框架”下添加Microsoft.Expressions.InteractionSystem.Windows.Interactivity

之后,將以下引用添加到XAML文件的頂部:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

然后,您可以執行以下操作:

<Grid>
    <i:Interaction.Triggers>
        <ei:DataTrigger Binding="{Binding MyAwesomeProperty}" Value="True">
            <ei:ControlStoryboardAction Storyboard="{StaticResource YourAwesomeStoryboard}" ControlStoryboardOption="Play"/>
            <ei:ChangePropertyAction PropertyName="{Binding MyAwesomeProperty}" Value="False"/>
        </ei:DataTrigger>
    </i:Interaction.Triggers>
</Grid>

如果沒有代碼,則根本無法實現。 我建議您從代碼背后在ViewModel上觸發一個Command來處理邏輯。 這樣,您就不會違反MVVM模式。

我可以看到的一個立即解決方案是,通過背后的代碼啟動情節提要並訂閱情節提要完成事件。 您可以使用以下代碼啟動情節提要:

Storyboard storyBoard = (Storyboard)this.Resources["YourStoryBoard"];
storyBoard.Begin();

然后訂閱其活動

storyboard.Completed += storyboard_Completed;

void storyboard_Completed(object sender, System.EventArgs e)
{
    // your code here
}

希望這對您有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM