0

ボタンの 1 つにカスタム IComand クラスを実装しました。ボタンはページ 'MyPage.xaml' に配置されますが、そのカスタム ICommand クラスは、MyPage コード ビハインドではなく、別のクラスに配置されます。次に、XAML からボタンをそのカスタム コマンド クラスにバインドし、次のようにします。

マイページ.xaml:

    <Page ...>

         <Page.CommandBindings>
             <CommandBinding Command="RemoveAllCommand"
                CanExecute="CanExecute"
                Executed="Execute" />
         </Page.CommandBindings>

         <Page.InputBindings>
                <MouseBinding Command="RemoveAllCommand" MouseAction="LeftClick" />
         </Page.InputBindings>

             <...>
               <Button x:Name="MyButton"  Command="RemoveAllCommand" .../>
             <...>

    </Page>

およびカスタム コマンド ボタン クラス:

// Here I derive from MyPage class because I want to access some objects from 
// Execute method
public class RemoveAllCommand : MyPage, ICommand 
{

    public void Execute(Object parameter)
    {
        <...>
    }

    public bool CanExecute(Object parameter)
    {
        <...>
    }


    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }  

}

私の問題は、ボタンの Execute および CanExecute メソッドが別のクラスにあり、ボタンが配置されているコードの背後にある MyPage.xaml をどのように言うかです。これらのメソッドが XAML ページの RemoveAllCommand クラスにあると言う方法。

また、ボタンでクリック マウス イベントが発生したときにこのコマンドを起動したいので、入力バインディングを行いますが、正しいですか?

ありがとう

4

3 に答える 3

1

ICommand があるので、Command プロパティを介してボタンにバインドできます。ボタンはそれを使用します。つまり、CanExecute を呼び出してそれ自体を有効/無効にし、ボタンが押されたときに Execute メソッドを呼び出します。他の入力バインディングは必要ありません。

問題は、ボタンがコマンドを見つけなければならないことです。簡単な解決策は、ボタン (またはその親) の DataContext にコマンドのインスタンスを配置することです。

DataContext に RemoveAllCommand 型の RemoveAll というプロパティがある場合は、XAML ボタンを次のように変更するだけです。

<Button Command="{Binding RemoveAll}" .. />

CommandBinding と InputBinding を削除します。

于 2010-03-29T11:02:18.587 に答える
0

わかりました、ありがとう、明日試してみます。

問題を回避するために、RemoveAllCommandClass クラスのすべてを MyPage のコード ビハインドに移動し、いくつかの変更を行いました。

1.- これを MyPage.xaml に追加しました:

xmlns:local="clr-namespace:GParts"

それから私はやった:

<Page.CommandBindings>
    <CommandBinding Command="{x:Static local:Pages.MyPage._routedCommand}"
               Executed="Execute"
               CanExecute="CanExecute"/>
</Page.CommandBindings>


<Button Command="{x:Static local:Pages.MyPage._routedCommand}"  .../>

そして、すべて問題なく動作します。ボタンを押すと、Execute メソッドで呼び出されるバックグラウンド ワーカー (bw) が実行されます。bw は別のクラスです。バックグラウンド ワーカー クラスには、bw が実行中かどうかを示す変数 (isRunning) があります。DoWork イベントを実行する前に true に設定し、bw が完了すると、RunWorkerCompleted で false に設定します。したがって、CanExecute から bw クラスで isRunning をチェックし、isRunning が false の場合は e.canExecute を true に設定し、isRunning が true の場合は e.canExecute を false に設定します。そのため、bw の実行時にボタンは WPF によって自動的に無効になりますが、bw が終了すると、ボタンは無効のままになり、もう一度押すまで有効に戻りません。ボタンをもう一度押すまで、bwが終了したときにWPFがボタンの状態を有効に更新しないのはなぜですか?

ありがとう。

于 2010-03-29T19:40:02.117 に答える
0

やったのですが、成功しませんでした。プロジェクトのビルド時にエラーが発生しました: タイプ RemoveAllCommand のインスタンスを作成できません。

私はそれをやった:

MyPage.xaml (ページから CommandBinding と InputBinding を削除しました):

<Page  x:Class="GParts.Pages.MyPage" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;
assembly=PresentationFramework.Aero"            
xmlns:Classes="clr-namespace:GParts.Classes"   
xmlns:Pages="clr-namespace:GParts.Pages">

<Page.Resources>
      <...>
         <Pages:RemoveAllCommand x:Key="RemoveAllCommandInstance"/>
      <...>
</Page.Resources>

<...>
<Button Command="{Binding RemoveAllCommandInstance}" ...>  
<...>
</Page>

カスタム Icommand クラスに、パラメーターなしのコンストラクターを追加しました。

public class RemoveAllCommand : MyPage, ICommand 
{

    public RemoveAllCommand() { }

    ...
}

ありがとう。

于 2010-03-29T11:42:01.900 に答える