1

私は MVVM パターンを使用しているため、ビュー モデルはビューについて何も認識せず、ビューは DataTemplates を介して表示されます。

ビューが表示されなくなったら、(ユーティリティ クラスを使用して) スクリーンショットを撮りたいと思います。したがって、FrameworkElement.Unloaded にバインドし、ヒットしたら、別のコントロールで使用するユーザー コントロールのスクリーンショットを撮り、移動するビューを選択します。

この記事を読むと、添付されたプロパティが機能するように見えます (UserControl オブジェクトで使用しています) http://blog.functionalfun.net/2008/09/hooking-up-commands-to-events- in-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」プロパティに「Binding」を設定することはできません。「Binding」は、DependencyObject の DependencyProperty でのみ設定できます。

4

2 に答える 2

2

私が提案できる最善の方法は、通常のイベント ハンドラーにマップし、コントロール内から DataContext に対して OutOfViewCommand.Execute を呼び出すことです。また、コントロールに 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 に答える