2010-03-03 3 views
1

Общий контекст: приложение MVVM.Удаление/остановка раскадровки при изменении DataContext

У меня есть вид, называемый 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 запускает вспышку раскадровки при переходе к истине и удаляет (и останавливает) раскадровку при переходе на false.

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

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

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

ответ

0

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

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

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

+0

Ben, Большое спасибо за ваш ответ ... и я прошу прощения за мой медленный ответ на вас. Другие аспекты проекта взяли на себя какое-то время. Я не мог, к сожалению, получить событие DataContextChanged, но принял ваш совет по структуре v/vm. Хотя я был осторожен, чтобы выпустить дескрипторы (и отслеживать их, чтобы подтвердить), это был не хороший режим работы. Поэтому, исходя из ваших рекомендаций, я изменил структуру, чтобы освободить v/vms и создать чистые копии, когда это необходимо. Снова - большое спасибо за то, что нашли время, чтобы ответить. – Huw

+0

Huw, Glad Я был в состоянии помочь! Как вы сказали, даже будучи осторожным со структурами и т. Д., Вы в основном завершаете построение эталонного подсчета, что добавляет много накладных расходов на систему. Удачи! –

Смежные вопросы