Удалить / остановить раскадровку при изменении DataContext - PullRequest
1 голос
/ 03 марта 2010

Общий контекст: приложение MVVM.

У меня есть представление под названием JobView. Его DataContext - это класс с именем Job. Внутри Job есть свойство с именем AuthorizationNeeded.

Граница в представлении имеет стиль (из словаря ресурсов), и у этого стиля есть триггер данных, который запускает и останавливает раскадровку на основе связанного свойства AuthorizationNeeded.

<Style x:Key="AuthorizationNeededBorder"
       TargetType="Border">
    <Setter Property="Background"
            Value="Yellow" />
    <Setter Property="Opacity"
            Value="0" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding AuthorizationNeeded, FallbackValue=False}"
                     Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard Name="Flash"
                                 Storyboard="{StaticResource OneSecondOpacityFlash}" />
            </DataTrigger.EnterActions>
            <DataTrigger.ExitActions>
                <RemoveStoryboard BeginStoryboardName="Flash" />
            </DataTrigger.ExitActions>
        </DataTrigger>
    </Style.Triggers>
</Style>

Все работает как положено. Изменение значения AuthorizationNeeded запускает вспышку раскадровки при переходе в true и удаляет (и останавливает) раскадровку при переходе в false.

Однако, если я изменю DataContext JobView на другой ViewModel (другое задание) во время работы раскадровки, даже если значение AuthorizationNeeded-значения false в новом задании, раскадровка продолжает выполняться.

Триггер данных не видит изменения значения из AuthorizationNeeded true -> false во время изменения DataContext.

Любые идеи о том, как я могу получить желаемое поведение AuthorizationNeed = true = storboard, работающий на AuthorizationNeeded = false = раскадровка, не работающая при любых обстоятельствах, будет принята с благодарностью. (Я бы предпочел не изменять значение AuthorizationNeeded вручную при изменении DataContext, потому что в действительности существует много таких триггеров для этого представления ...)

1 Ответ

0 голосов
/ 03 марта 2010

Я бы рассмотрел добавление триггера к событию DataContextChanged на объекте. Что-то вроде:

<Style.Triggers>
    <EventTrigger EventName="DataContextChanged">
        <StopStoryboard Storyboard="{StaticResource OneSecondOpacityFlash}" />
    </EventTrigger>
</Style.Triggers>

Я хотел бы знать, однако, хотите ли вы изменить DataContext в существующем объекте представления или было бы лучше создать новое представление, привязанное к новому DataContext. В зависимости от того, что вы делаете, я думаю, что замена DataContexts может привести к удержанию дополнительных дескрипторов. В зависимости от того, что является вашим контейнером, может быть легче удалить и воссоздать дочернюю view / viewmodel, чем поменять местами.

...