2

WPFアプリケーションでいくつかのカスタムコマンドを定義しました。

public class MyCommands {

    public static RoutedUICommand CopyPlateCommand;

    public static RoutedUICommand PreviousRecordCommand;

    public static RoutedUICommand NextRecordCommand;

    public static RoutedUICommand SearchCommand;

    public static RoutedUICommand SearchPlateCommand;

}

私はこれらのコマンドのいくつかを使用するものUserControlを持っています:ContextMenus

<UserControl x:Class="MyNamespace.UserControl1" 
        . . . > 
    <UserControl.Resources>
        <ContextMenu x:Key="ContextMenu" HorizontalAlignment="Left">
            <MenuItem Header="Copy Plate"   Command="{Binding cs:MyCommands.CopyPlateCommand}" />
            <MenuItem Header="Search Plate" Command="{Binding cs:MyCommands.SearchPlateCommand}" />
        </ContextMenu>
        <ContextMenu x:Key="TextBoxMenu" HorizontalAlignment="Left">
            <MenuItem Header="Copy"            Command="{Binding Copy}" />
            <MenuItem Header="Copy Plate"   Command="{Binding cs:MyCommands.CopyPlateCommand}" />
            <MenuItem Header="Search Plate" Command="{Binding cs:MyCommands.SearchPlateCommand}" />
        </ContextMenu>
    </UserControl.Resources>
                             . . . 
</UserControl>

にはコマンドバインディングはありませんUserControl1

UserControlのインスタンスを含む別のものがありますUserControl1。またCommandBindings、次のコンテキストメニューに含まれるコマンドも含まれていUserControl1ます。

<UserControl x:Class="MyNamespace.UserControl2" 
        . . . > 
    <UserControl.CommandBindings>
        <CommandBinding Command="Copy"                                    CanExecute="CopyCommand_CanExecute"      Executed="CopyCommand_Executed" />
        <CommandBinding Command="cs:MyCommands.CopyPlateCommand"   CanExecute="CopyPlateCommand_CanExecute" Executed="CopyPlateCommand_Executed" />
        <CommandBinding Command="cs:MyCommands.SearchPlateCommand" CanExecute="CopyPlateCommand_CanExecute" Executed="SearchPlateCommand_Executed" />
</UserControl.CommandBindings>
                             . . . 
    <c:UserControl1 . . . />

コマンドのさまざまなハンドラーにブレークポイントを配置しましたが、ブレークポイントがヒットすることはありません。私は何を間違えましたか?コマンドバインディングをに入れる必要がありますUserControl1か?

いいえ、私のプログラムはMVVMを使用していません。私はMVVMについて聞く前にプロジェクトを開始しました。将来的にはこれをMVVMに変換するつもりですが、今は時間がありません。私はいくつかのバグ修正をドアの外に出す必要があり、これは私を妨げています。

理解に感謝。

トニー

4

2 に答える 2

3

Commandクラスは、パブリックフィールドではなく、パブリックプロパティを公開する必要があります。

ほとんどのバインドはComponentModelPropertyDescriptorモデルに基づいているため、フィールドではなくプロパティにバインドする必要があります。プロパティは、バインディングエンジンがバインディングを有効にするために必要なこのメタデータを公開します。

共通言語ランタイム(CLR)オブジェクトへのバインド:

共通言語ランタイム(CLR)オブジェクトのパブリックプロパティ、サブプロパティ、およびインデクサーにバインドできます。バインディングエンジンは、CLRリフレクションを使用してプロパティの値を取得します。または、ICustomTypeDescriptorを実装するオブジェクト、またはTypeDescriptionProviderが登録されているオブジェクトもバインディングエンジンで動作します。

バインディングソース仕様から取得。

以下の例:

public class MyCommands {

    public static RoutedUICommand CopyPlateCommand { get; set; }

    public static RoutedUICommand PreviousRecordCommand { get; set; }

    public static RoutedUICommand NextRecordCommand { get; set; }

    public static RoutedUICommand SearchCommand { get; set; }

    public static RoutedUICommand SearchPlateCommand { get; set; }

}

アプリケーションをデバッグモードで実行する場合は、「出力」ウィンドウでバインディングエラーを確認してください。

于 2012-10-03T21:42:42.623 に答える
0

クラスで作成したRoutedUICommandオブジェクトはフィールドであり、プロパティではありませんでしたが、プログラムを機能させるにはそれだけでは不十分でした。XAMLで、inのプロパティをに設定する方法を理解できませんCommandTargetでした。MenuItemsUserControl1UserControl2

私はそれを機能させましたが、コードビハインドでそれを行うことになりました。私がしたことは、次のようなヘルパーメソッドを作成したことFixMenuItemsです。

private void FixMenuItems( FrameworkElement element, Func<MenuItem, bool> condition, FrameworkElement target ) {
    foreach ( MenuItem menuItem in element.ContextMenu.Items ) {
        if ( condition( menuItem ) ) {
            menuItem.CommandTarget = target;
        }
    }
}

SetupCommandTargets次に、 :というパブリックメソッドを作成しました。

public void SetupCommandTargets( FrameworkElement target, Func<MenuItem, bool> condition ) {
    FixMenuItems( Control1, condition, target );
    FixMenuItems( Control2, condition, target );        . . .
}

次に、とのコンストラクターでUserControl1、必要に応じてパブリック関数を呼び出します。これらのハンドラーはそのクラスのプライベートプロパティにアクセスする必要があるためUserControl2、一部のコントロールのハンドラーをに移動しました。UserControl1

Bindingsまた、のCommandプロパティを削除する必要がありましたMenuItemsCommandBindingsXAMLで行うことができました。それはCommandTargets私が仕事に就けなかっただけでした。

これらすべての変更を行った後、すべてが機能するようになりました。すべてが適切なコントロールを指し、MenuItemsそれらは正しく有効化および無効化されます。それぞれが適切なアクションを実行します。私は満足しています。

于 2012-10-04T16:17:17.860 に答える