2011-12-06 21 views
13

Tôi đang cố gắng sử dụng thông điệp vi caliburn để kích hoạt một sự kiện gắn liền mà tôi tạo ra:sử dụng các sự kiện gắn liền với caliburn vi Message.Attach

public static class DataChanging 
{ 

    public delegate void DataChangingEventHandler(object sender, DataChangingEventArgs e); 
    public static readonly RoutedEvent ChangingEvent = 
     EventManager.RegisterRoutedEvent("Changing", 
             RoutingStrategy.Bubble, 
             typeof(DataChangingEventHandler), 
             typeof(DataChanging)); 

    public static void AddChangingHandler(DependencyObject o, DataChangingEventHandler handler) 
    { 
     ((UIElement)o).AddHandler(DataChanging.ChangingEvent, handler); 
    } 
    public static void RemoveChangingHandler(DependencyObject o, DataChangingEventHandler handler) 
    { 
     ((UIElement)o).RemoveHandler(DataChanging.ChangingEvent, handler); 
    } 

    public static bool GetActivationMode(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(ActivationModeProperty); 
    } 
    public static void SetActivationMode(DependencyObject obj, bool value) 
    { 
     obj.SetValue(ActivationModeProperty, value); 
    } 
    public static readonly DependencyProperty ActivationModeProperty = 
     DependencyProperty.RegisterAttached("ActivationMode", 
              typeof(bool), 
              typeof(DataChanging), 
              new FrameworkPropertyMetadata(false, 
                      HandleActivationModeChanged)); 

    private static void HandleActivationModeChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
    { 
     var dataGrid = target as XamDataGrid; 
     if (dataGrid == null) // if trying to attach to something else than a datagrid, just ignore 
      return; 
     if ((bool)e.NewValue) 
     { 
      dataGrid.RecordDeactivating += selector_RecordDeactivating; 
     } 
     else 
     { 
      dataGrid.RecordDeactivating -= selector_RecordDeactivating; 
     } 
    } 

    static void selector_RecordDeactivating(object sender, RecordDeactivatingEventArgs e) 
    { 

     var args = new DataChangingEventArgs(DataChanging.ChangingEvent,sender) 
         { 
          Data = ((DataRecord) e.Record).DataItem, 
          ShouldCancelChange = false 
         }; 
     (sender as UIElement).RaiseEvent(args); 
     e.Cancel = args.ShouldCancelChange; 
    } 
} 

Trong XAML bản thân tôi đã thêm dòng sau:

cal:Message.Attach="[Helpers:DataChanging.Changing] = [Action SelectedDataChanged($eventArgs)]" 

Người trợ giúp tham khảo không gian tên phù hợp. Tôi cũng đã cố gắng phiên bản khác mà thất bại (full namespace):

cal:Message.Attach="[clr-namespace:RTF.Client.UI.Helpers.DataChanging.Changing] = [Action SelectedDataChanged($eventArgs)]" 

cố gắng để thiết lập các sự kiện tương tác bằng cách bản thân mình:

Khi tôi cố gắng thêm một sự kiện bình thường gây ra tất cả mọi thứ hoạt động tốt, do đó, nó không phải là tuyên bố sự kiện đính kèm của tôi:

<EventTrigger RoutedEvent="Helpers:DataChanging.Changing"> 
        <EventTrigger.Actions> 
         <BeginStoryboard x:Name="sb"> 
          <Storyboard x:Name="dsf"> 
           <Storyboard x:Name="myStoryboard"> 
            <BooleanAnimationUsingKeyFrames Storyboard.TargetName="SSS" Storyboard.TargetProperty="IsChecked"> 
             <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" /> 
            </BooleanAnimationUsingKeyFrames> 
           </Storyboard> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger.Actions> 
       </EventTrigger> 

Tôi đang làm gì vậy ng đây? Không có cách nào để đính kèm một sự kiện đính kèm và gọi nó bằng cách sử dụng micro caliburn?

Trả lời

12

cuối cùng tôi hiểu được vấn đề và giải pháp. Vấn đề là system.windows.interactiviy.EventTrigger không hỗ trợ các sự kiện đính kèm. Micro Caliburn sử dụng nó cho các hành động, do đó sự kiện đính kèm của tôi không hoạt động. Giải pháp là viết trình kích hoạt sự kiện tùy chỉnh và sử dụng hành vi vi mô caliburn theo cách rõ ràng. các tùy chỉnh kích hoạt sự kiện được lấy từ bài rằng: http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html?showComment=1323674885597#c8041424175408473805

public class RoutedEventTrigger : EventTriggerBase<DependencyObject> 
{ 
    RoutedEvent _routedEvent; 
    public RoutedEvent RoutedEvent 
    { 
     get { return _routedEvent; } 
     set { _routedEvent = value; } 
    } 

    public RoutedEventTrigger() { } 
    protected override void OnAttached() 
    { 
     Behavior behavior = base.AssociatedObject as Behavior; 
     FrameworkElement associatedElement = base.AssociatedObject as FrameworkElement; 
     if (behavior != null) 
     { 
      associatedElement = ((IAttachedObject)behavior).AssociatedObject as FrameworkElement; 
     } 
     if (associatedElement == null) 
     { 
      throw new ArgumentException("Routed Event trigger can only be associated to framework elements"); 
     } 
     if (RoutedEvent != null) 
     { associatedElement.AddHandler(RoutedEvent, new RoutedEventHandler(this.OnRoutedEvent)); } 
    } 
    void OnRoutedEvent(object sender, RoutedEventArgs args) 
    { 
     base.OnEvent(args); 
    } 
    protected override string GetEventName() { return RoutedEvent.Name; } 
} 

và sau đó khi bạn muốn sử dụng hành động caliburn:

<i:Interaction.Triggers> 
       <!--in the routed event property you need to put the full name space and event name--> 
       <Helpers:RoutedEventTrigger RoutedEvent="Helpers:DataChanging.Changing"> 
        <cal:ActionMessage MethodName="SelectedDataChanged"> 
         <cal:Parameter Value="$eventargs" /> 
        </cal:ActionMessage> 
       </Helpers:RoutedEventTrigger> 
</i:Interaction.Triggers> 
0

Tôi không nghĩ rằng trình phân tích cú pháp cho cú pháp Message.Attach được rút ngắn hỗ trợ các sự kiện đính kèm. Nhưng tại sao bạn không chỉ thêm ActionMessage trực tiếp vào các hành động của EventTrigger?

<EventTrigger RoutedEvent="Helpers:DataChanging.Changing"> 
    <EventTrigger.Actions> 
     <!-- new part --> 
     <cal:ActionMessage MethodName="SelectedDataChanged"> 
      <cal:Parameter Value="$eventargs" /> 
     </cal:ActionMessage> 
     <!-- /new part --> 
     <BeginStoryboard x:Name="sb"> 
      <Storyboard x:Name="dsf"> 
       <Storyboard x:Name="myStoryboard"> 
        <BooleanAnimationUsingKeyFrames Storyboard.TargetName="SSS" Storyboard.TargetProperty="IsChecked"> 
         <DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False" /> 
        </BooleanAnimationUsingKeyFrames> 
       </Storyboard> 
      </Storyboard> 
     </BeginStoryboard> 
    </EventTrigger.Actions> 
</EventTrigger> 
+0

Tôi đã thử nó, nhưng thông điệp Caliburn hành động này chỉ áp dụng khi hành động để hệ thống .các cửa sổ. tương tác.Event kích hoạt và không phải là bình thường. thành thật mà nói, tôi không chắc chắn sự khác biệt giữa 2. Tôi đã không thể bắt đầu sự kiện của mình bằng cách sử dụng trình kích hoạt system.windows.interactivity.event. – Clueless

0

Các bạn đã thử này?

cal:Message.Attach="[Event Changing] = [Action SelectedDataChanged($eventArgs)]" 

Tôi cần gửi sự kiện từ kiểm soát con đến bố mẹ ViewModel và nó hoạt động tốt cho tôi. Tôi sẽ đăng một số mã ví dụ có thể nó sẽ giúp một ai đó ra! codebehind

Child Control: Kiểm soát

public partial class MyControl : UserControl 
{ 
    public MyControl() 
    { 
     InitializeComponent(); 
    } 

    #region Routed Events 

    public static readonly RoutedEvent ControlClosedEvent = EventManager.RegisterRoutedEvent(
     "ControlClosed", 
     RoutingStrategy.Bubble, 
     typeof(RoutedEventHandler), 
     typeof(MyControl)); 

    public event RoutedEventHandler ControlClosed 
    { 
     add { AddHandler(ControlClosedEvent, value); } 
     remove { RemoveHandler(ControlClosedEvent, value); } 
    } 

    #endregion Routed Events 

    private void Close(object sender, RoutedEventArgs e) 
    { 
     var rea = new RoutedEventArgs(ControlClosedEvent); 
     RaiseEvent(rea); 
    } 
} 

Child XAML: xem

<Button Grid.Row="1" Grid.Column="0" 
     Content="Close Me!" Height="50" 
     Click="Close" /> 

phụ huynh:

<userControls:MyControl cal:Message.Attach="[Event ControlClosed] = [Action ClosePopup]" /> 
Các vấn đề liên quan