4

現在、値が変更されたときに DataGrid セルをフラッシュする次のコードがあります。

<TextBlock Background="White" Text={Binding Date, NotifyOnTargetUpdated=True} >
    <EventTrigger RoutedEvent="Binding.TargetUpdated" >
        <BeginStoryboard>
            <Storyboard>
                <ColorAnimation AutoReverse="True" From="#1F1F1F" To="#FFFF88" Duration="0:0:0.2" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" />
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</TextBlock>

ビューモデルのブール値が true の場合にのみ、このアニメーションを実行する必要があります。どうすればこれを達成できますか?

編集:サンプルを拡張

ありがとう。

4

3 に答える 3

2

別のフォーラムで回答してくれた XAML 担当者に感謝します。これは質問に対する答えです。解決策は、次の添付された動作を使用することです。

class AttachedBehaviours
{
    public static bool GetAllowTargetUpdated(DependencyObject obj)
    {
        return (bool)obj.GetValue(AllowTargetUpdatedProperty);
    }

    public static void SetAllowTargetUpdated(DependencyObject obj, bool value)
    {
        obj.SetValue(AllowTargetUpdatedProperty, value);
    }

    // Using a DependencyProperty as the backing store for AllowTargetUpdated.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty AllowTargetUpdatedProperty =
        DependencyProperty.RegisterAttached("AllowTargetUpdated", typeof(bool), typeof(AttachedBehaviours), new UIPropertyMetadata(false, PropChanged));


    static void PropChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var ele = obj as FrameworkElement;
        var be = ele.GetBindingExpression(TextBlock.TextProperty);
        if (be == null) return;

        var b = be.ParentBinding;

        var newBinding = new Binding(b.Path.Path);
        newBinding.NotifyOnTargetUpdated = (bool)e.NewValue;

        ele.SetBinding(TextBlock.TextProperty, newBinding);
    }
}

そして、これは XAML からの使用法です。

<TextBlock Background="White" Text="{Binding Date}"  local:AttachedBehaviours.AllowTargetUpdated="{Binding EnableAnimations}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,10,0,0"  >
于 2012-06-13T08:37:05.427 に答える
1

さて、これが私が問題を解決した方法です。おそらく私が今まで書いた中で最も醜いコードの1つなので、もっと良いものを自由に提案してください。

アニメーションを有効/無効にするブール値を使用して期間にバインドするコンバーターを作成しました。このようなもの:

class AnimationEnablerConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool enableAnimation = (bool)value;

        if (enableAnimation)
        {
            return new System.Windows.Duration(new TimeSpan(0, 0, 0, 0, 200));
        }
        else
        {
            return new System.Windows.Duration(new TimeSpan(0, 0, 0, 0, 0));
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

そしてxaml:

<ColorAnimation AutoReverse="True" From="#1F1F1F" To="#FFFF88" Duration="{Binding IsAnimationEnabled, Converter={StaticResource anim2}}" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" />
于 2012-06-08T15:43:53.147 に答える
1

次のようなことを試しましたか:

<ControlTemplate.Triggers>
    <DataTrigger Value="false">
        <DataTrigger.EnterActions>
            <BeginStoryboard> 
            <Storyboard> 
                <ColorAnimation AutoReverse="True" From="#1F1F1F" To="#FFFF88" Duration="0:0:0.2" Storyboard.TargetProperty="Background.Color" FillBehavior="Stop" /> 
            </Storyboard> 
        </BeginStoryboard> 

       </DataTrigger.EnterActions>
    </DataTrigger>
</ControlTemplate.Triggers>
于 2012-06-07T19:38:08.807 に答える