2012-06-06 6 views
1

Я использую шаблон MVVM, поэтому моя модель представления ничего не знает о представлении, и представление отображается через DataTemplates.WPF привязка ICommand к событию (FrameworkElement.Unloaded)

Когда представление больше не отображается, я хочу сделать снимок экрана (с классом полезности). Поэтому я хочу привязать к FrameworkElement.Unloaded, и когда его ударит, сделайте снимок экрана usercontrol для использования в другом элементе управления, чтобы выбрать, к какому виду перейти.

Я прочитал эту статью, которая делает вид, как будто присоединенные свойства будут работать (я использую его на объекте UserControl) http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-in-wpf.html

Я получаю ошибку, что связывание может быть установлено только на DependencyObject или DependencyProperty. Я следовал его инструкциям должным образом. Любая идея, почему это не работает или как я могу привязываться к сценарию MVVM?

Невозможно ли привязать это событие или к событию в корневом узле xaml?

Вот Teh код (в дополнение к EventBehaviorFactory в приведенной выше ссылке)

public static class FrameworkElementBehavior 
{ 
    public static readonly DependencyProperty UnloadedCommandProperty = EventBehaviourFactory.CreateCommandExecutionEventBehaviour(FrameworkElement.UnloadedEvent, "UnloadedCommand", typeof(FrameworkElementBehavior)); 

    public static void SetUnloadedCommand(DependencyObject o, ICommand value) 
    { 
     o.SetValue(UnloadedCommandProperty, value); 
    } 

    public static ICommand GetUnloadedCommand(DependencyObject o) 
    { 
     return o.GetValue(UnloadedCommandProperty) as ICommand; 
    } 
} 


    <UserControl x:Class="WTF.BuxComp.Prism.Modules.Win.OrderEntryPos.Views.CustomerView" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       xmlns:local="clr-namespace:WTF.BuxComp.Prism.Modules.Win.OrderEntryPos.Helpers" 
       mc:Ignorable="d" 
       d:DesignHeight="510" d:DesignWidth="716" 
local:FrameworkElementBehavior.UnloadedCommand="{Binding UnloadedCommand}"> 

и точная ошибка

A «Связывание» не может быть установлен на свойство «SetUnloadedCommand» из тип «CustomerView». «Связывание» может быть установлено только на DependencyProperty a DependencyObject.

ответ

1

Лучшее, что я могу предложить, это сопоставить с обычным обработчиком событий, а затем вызвать OutOfViewCommand.Execute изнутри вашего элемента управления в ваш DataContext. Вам также нужно будет сопоставить UserControl.DataContextChanged на вашем элементе управления и сохранить локальный файл данных локально.

public partial class MainWindow : Window 
{ 
    private object Data { get; set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     this.Data = e.NewValue; 
    } 

    private void Window_Unloaded(object sender, RoutedEventArgs e) 
    { 
     if(this.Data != null) 
      this.Data.OutOfViewCommand.Execute(null); 
    } 
} 

XAML:

<Window x:Class="WpfApplication3.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525" DataContextChanged="Window_DataContextChanged" FrameworkElement.Unloaded="Window_Unloaded"> 
<Grid> 

</Grid> 

Хотя это не строго соответствовать MVVM, компромисс вы будете часто сталкиваются с рамочными вызовов, он по-прежнему работает в многоразовой способом с любым посмотреть модель.

+0

Для еще более универсальным решением, которое вы могли бы заменить «this.Data.OutOfViewCommand .Execute (null) "with" (DataBinder.Eval (this.Data, "OutOfViewCommand") как ICommand) .Execute (null) " – jimmyjambles

1

Для этого вам может понадобиться, чтобы правильно назвать свою присоединенную proerty .... его имя объявили это OutOfViewCommand, но оно должно быть UnloadedCommand

public static class FrameworkElementBehavior 
{ 
    public static readonly DependencyProperty UnloadedCommandProperty = 
     EventBehaviourFactory.CreateCommandExecutionEventBehaviour 
      (FrameworkElement.UnloadedEvent, 
      "UnloadedCommand", 
      typeof(FrameworkElementBehavior)); 

    public static void SetUnloadedCommand 
     (DependencyObject o, ICommand value) 
    { 
     o.SetValue(UnloadedCommandProperty, value); 
    } 

    public static ICommand GetUnloadedCommand 
     (DependencyObject o) 
    { 
     return o.GetValue(UnloadedCommandProperty) as ICommand; 
    } 
} 
+0

Похоже, что устранена ошибка времени выполнения, но команда не выполняется. –