WPF-анимация DataTrigger не работает

Итак, я пытаюсь сделать некоторые анимации во время удаления элемента из ItemsControl, который прикреплен к ObservableCollectio<Item>. Я знаю, что не могу сделать это в событии выгрузки, потому что просто слишком поздно выполнять какую-либо анимацию, поэтому я попытался сделать это с помощью DataTrigger

Мой файл xaml выглядит так:

 <DataTemplate DataType="{x:Type MyApp:Item}">
        <Border x:Name="ItemBorder">
            <Label Content="{Binding Path=Name}" />
        </Border>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=Removing}" Value="True">
                <DataTrigger.EnterActions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1" From="1.0" To="0.0"
                                           Storyboard.TargetProperty="(Border.Opacity)" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger>
        </DataTemplate.Triggers>
</DataTemplate>

и мой класс Item просто:

public class Item : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    private bool removing;
    public bool Removing {
        get
        {
            return removing;
        }
        set
        {
            removing = value;
            PropertyChanged(this, new PropertyChangedEventArgs("Removing"));
        }
    }

    // same with `Name` property
}

Я хотел бы запустить анимацию, установив item.Removing = true, но ничего не происходит.

Что я делаю неправильно?


person Adassko    schedule 19.09.2013    source источник
comment
Где Storyboard.TargetName?   -  person Dennis    schedule 19.09.2013


Ответы (1)


Вам нужно будет обновить анимацию, как показано ниже, т.е. указать имя элемента:

              <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Removing}" Value="True">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard>
                                        <DoubleAnimation Duration="0:0:1" From="1.0" To="0.0"
                                           Storyboard.TargetProperty="Opacity" Storyboard.TargetName="ItemBorder" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>

                        </DataTrigger>
             </DataTemplate.Triggers>

OR

Попробуйте поместить анимацию непосредственно в стиль границы, как показано ниже:

<DataTemplate DataType="{x:Type MyApp:Item}">
    <Border x:Name="ItemBorder">
        <Label Content="{Binding Path=Name}" />
        <Border.Style>
           <Style TargetType="Border">
              <Style.Triggers>
                 <DataTrigger Binding="{Binding Path=Removing}" Value="True">
                    <DataTrigger.EnterActions>
                      <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Duration="0:0:1" From="1.0" To="0.0"
                                           Storyboard.TargetProperty="Opacity" />
                        </Storyboard>
                    </BeginStoryboard>
                </DataTrigger.EnterActions>
            </DataTrigger> 
          <Style.Triggers>
        </Style>         
</DataTemplate>
person Nitin    schedule 19.09.2013
comment
братан, я пробовал со своей стороны, и это сработало просто отлично ... можете ли вы проверить, получаете ли вы какие-либо ошибки привязки в окне вывода ... если нет, можете ли вы опубликовать свой полный код xaml? - person Nitin; 19.09.2013
comment
хорошо, моя беда - теперь он работает нормально, но я установил Binding в Border.Style для другой цели, и я не знаю, как объединить эти два вместе - он говорит, что The property Style is set more than once - person Adassko; 19.09.2013
comment
можете ли вы поделиться своим кодом .. это поможет мне лучше понять его - person Nitin; 19.09.2013
comment
это очень похоже на код выше, но есть еще одна строка в Border.Style: <Binding Path="Status" Mode="OneWay" Converter="{StaticResource StyleConverter}" /> и я хотел бы оставить ее там - person Adassko; 19.09.2013
comment
так что ваш преобразователь будет возвращать экземпляр некоторого стиля rt? вы можете переместить триггер, который мы написали, в этот style.triggers.. он будет работать - person Nitin; 19.09.2013
comment
но мне пришлось бы добавить этот триггер в каждый стиль, который возвращает конвертер. Я также хотел бы сохранить эти две функции отдельно. - person Adassko; 19.09.2013
comment
если вы хотите, чтобы каждый ваш стиль имел этот триггер... вы можете поместить его в один базовый триггер и просто создать другие триггеры на его основе. - person Nitin; 19.09.2013
comment
хм, лучшим подходом для меня будет тот, что был в моем первом посте, но я прислушаюсь к вашему совету, если у меня не получится :) - person Adassko; 19.09.2013
comment
обновил ответ, чтобы ваш триггер datatemplate работал... надеюсь, это поможет :) - person Nitin; 19.09.2013