как обновить триггер данных wpf? - PullRequest
2 голосов
/ 02 сентября 2011

у меня есть сетка с раскадровкой, как показано ниже.

<Grid x:Name="grd_Order"   Grid.Column="2" Height="16" Margin="0,-2,0,0" Visibility="Collapsed" HorizontalAlignment="Center" VerticalAlignment="Center">
  <Grid.Resources>
    <Storyboard x:Key="stry_OrderMsgShowHide"  RepeatBehavior="3x">
     <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(Visibility)" >
       <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}"/>
       <DiscreteObjectKeyFrame KeyTime="0:0:2" Value="{x:Static Visibility.Collapsed}"/>
     </ObjectAnimationUsingKeyFrames>
   </Storyboard>
  </Grid.Resources>
<Grid.Style>
 <Style >
   <Style.Triggers>
     <DataTrigger Value="True" Binding="{Binding Path=BlinkOrderAlert,Mode=TwoWay}">
       <DataTrigger.EnterActions>
        <BeginStoryboard x:Name="stry_BlinkOrdAlert" Storyboard="{StaticResource stry_OrderMsgShowHide}"/>
       </DataTrigger.EnterActions>
     </DataTrigger>
  </Style.Triggers>
</Style>

и в моем ViewModel.cs,

        private bool blinkOrderAlert;
        public bool BlinkOrderAlert
        {
            get
            {
                return blinkOrderAlert;
            }
            set
            {
                if (blinkOrderAlert == value)
                    return;
                this.blinkOrderAlert = value;
                this.RaisePropertyChanged(this, new PropertyChangedEventArgs("BlinkOrderAlert"));
            }
        }

        public void BlinkOrdAlert()
        {
                this.BlinkOrderAlert=false;
                this.BlinkOrderAlert = true;

        }
public ViewModel()
{
  this.BlinkOrderAlert=true;
}

и работает только в первый раз, когда конструктор инициализирован. Всякий раз, когда я вызываю функцию BlinkOrdAlert, она больше не работает. Как я могу изменить datatrigger для запуска раскадровки каждый раз, когда я вызываю функцию? Благодарю.

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Попробуйте добавить следующий триггер данных в свой стиль. Следующий триггер данных удалит раскадровку, когда для значения BlinkOrderAlert установлено значение false, а когда значение равно true, добавится раскадровка.

надеюсь, это поможет.

<DataTrigger Value="False" Binding="{Binding Path=BlinkOrderAlert,Mode=TwoWay}">
                    <DataTrigger.EnterActions>
                        <RemoveStoryboard BeginStoryboardName="stry_BlinkOrdAlert"></RemoveStoryboard>
                    </DataTrigger.EnterActions>                    
                </DataTrigger>
1 голос
/ 02 сентября 2011

Вы вообще не должны использовать DataTrigger для этого, вы пытаетесь использовать свойство, такое как событие, которое является довольно взломанным.К сожалению, собственные триггеры, скажем, не оптимальны, поэтому вы не можете использовать EventTrigger, поскольку он поддерживает только RoutedEvents.

Но вы можете использовать ViewModel-события, используя EventTrigger из Blend'sИнтерактивность ( Blend 3 SDK ) взамен, поэтому стоит попробовать.

...