WPF - 内容更改之前的数据绑定触发器

时间:2010-04-08 12:32:33

标签: wpf data-binding datatemplate triggers

如何创建触发器,在绑定更改值之前触发?如何为datatemplate做这个?

<ContentControl Content="{Binding Path=ActiveView}" Margin="0,95,0,0">
    <ContentControl.Triggers>
        <--some triger to fire, when ActiveView is changing or has changed ?!?!? -->
    </ContentControl.Triggers>

public Object ActiveView
{
    get { return m_ActiveView; }
    set {
        if (PropertyChanging != null)
            PropertyChanging(this, new PropertyChangingEventArgs("ActiveView"));
        m_ActiveView = value;
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs("ActiveView"));
    } 
}

如何为DataTemplate执行此操作?

<DataTemplate DataType="{x:Type us:LOLClass1}">
            <ContentControl>
                <ContentControl.RenderTransform>
                    <ScaleTransform x:Name="shrinker" CenterX="0.0" CenterY="0.0" ScaleX="1.0" ScaleY="1.0"/>
                </ContentControl.RenderTransform>
                <us:UserControl1/>
            </ContentControl>
            <DataTemplate.Triggers>
                <-- SOME TRIGER BEFORE CONTENT CHANGES-->
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="shrinker" Storyboard.TargetProperty="ScaleX" From="1.0" To="0.8" Duration="0:0:0.3"/>
                            <DoubleAnimation Storyboard.TargetName="shrinker" Storyboard.TargetProperty="ScaleY" From="1.0" To="0.8" Duration="0:0:0.3"/>
                        </Storyboard>
                    </BeginStoryboard>
                </-- SOME TRIGER BEFORE CONTENT CHANGES-->
            </DataTemplate.Triggers>
        </DataTemplate>

如何在更改绑定之前获取通知? (我想捕捉改变视觉组件到位图并创建滑动视图动画)

--------- SOLUTION ------------

我创建了从ContentControl派生的自定义控件并覆盖了ContentProperty ValueChanged回调

public class SmartContentControl : ContentControl
{
    public static readonly RoutedEvent ContentChangingEvent = EventManager.RegisterRoutedEvent("ContentChanging", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(SmartContentControl));
    public event RoutedEventHandler ContentChanging
    {
        add { AddHandler(ContentChangingEvent, value); }
        remove { RemoveHandler(ContentChangingEvent, value); }
    }

    public SmartContentControl()
    {
        ContentProperty.OverrideMetadata(typeof(SmartContentControl), new FrameworkPropertyMetadata(new PropertyChangedCallback(ContentPropertyChangedCallback)));
    }

    private static void ContentPropertyChangedCallback(DependencyObject _object, DependencyPropertyChangedEventArgs _eventArgs)
    {
        SmartContentControl control = (SmartContentControl)_object;
        RoutedEventArgs newEventArgs = new RoutedEventArgs(SmartContentControl.ContentChangingEvent);
        control.RaiseEvent(newEventArgs);
    }
}

1 个答案:

答案 0 :(得分:1)

使“ActiveView”成为依赖项属性并使用value coercion mechanism并填写Coerce值回调函数。

希望它有所帮助!!