1

我正在使用 MVVM 模式,因此我的视图模型对视图一无所知,并且视图通过 DataTemplates 显示。

当视图不再显示时,我想对其进行截图(使用实用程序类)。所以我想绑定到 FrameworkElement.Unloaded,当它命中时,截取用户控件的屏幕截图,以便在另一个控件中使用,以选择要转到的视图。

我读了这篇文章,它看起来好像附加属性可以工作(我在 UserControl 对象上使用它) http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events-在-wpf.html

我收到绑定只能在 DependencyObject 或 DependencyProperty 上设置的错误。我正确地遵循了他的指示。知道为什么这不起作用或如何在 MVVM 场景中绑定到它吗?

是否无法绑定到该特定事件或根 xaml 节点中的事件?

这是代码(除了上面链接中的 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}">

确切的错误是

不能在“CustomerView”类型的“SetUnloadedCommand”属性上设置“绑定”。只能在 DependencyObject 的 DependencyProperty 上设置“绑定”。

4

2 回答 2

2

我可以建议的最好的事情是映射到常规事件处理程序,然后从您的控件中调用 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,这是您在框架调用中经常遇到的折衷方案,但它仍然以可重用的方式与任何视图模型一起使用。

于 2012-06-06T23:32:59.897 回答
1

为此,您可能需要正确命名您的附加财产......它声明的名称是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;
    }
} 
于 2012-06-07T09:02:34.640 回答