代码之家  ›  专栏  ›  技术社区  ›  0xDEAD BEEF

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

  •  2
  • 0xDEAD BEEF  · 技术社区  · 16 年前

    如何创建在绑定更改值之前触发的触发器?如何对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 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>
    

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

    ---------解决方案------------

    我创建了从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 回复  |  直到 16 年前
        1
  •  1
  •   viky    16 年前

    使“ActiveView”成为依赖属性并使用 value coercion mechanism