0

私が望んでいたのは、タブごとに異なるバインドが必要だったので、タブを切り替えるとコマンドの可用性が切り替わりました。CommandBindings はそのように機能すると思いました。

しかし、この単純なサンプルを機能させるために最後の時間を費やしました。私が根本的に誤解している (そしてそれが最初ではない) か、何かが間違っているかのどちらかです。

CommandBinding を textBoxA に追加しますが、textBoxB には追加しません。それらの間を移動すると、対応するコマンドに設定されているボタンが有効または無効になります。

Window に CommandBinding を追加すると、ボタンは問題なく有効になりますが、そのようなものは、アイテム固有の CommandBinding の要点全体を殺します。

この XAML の使用

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="500">
    <Canvas>
        <Button Canvas.Left="31" Canvas.Top="24" Content="Click Me" Name="button1" Width="100"/>
        <TextBox Canvas.Left="155" Canvas.Top="22" Height="23" Name="textBoxA" Width="120" Text="A" />
        <TextBox Canvas.Left="298" Canvas.Top="22" Height="23" Name="textBoxB" Width="120" Text="B" />
    </Canvas>
</Window>

このコード ビハインドの使用

public MainWindow()
{
    InitializeComponent();

    button1.Command = ApplicationCommands.Open;

    var _Binding = new CommandBinding(button1.Command);
    textBoxA.CommandBindings.Add(_Binding);
    textBoxB.CommandBindings.Clear(); // nothing bound

    _Binding.CanExecute += (s, e) =>
    {
        e.CanExecute = true;
    };

    _Binding.Executed += (s, e) =>
    {
        MessageBox.Show("Hello");
    };
}

このコードを試してみると、あるテキストボックスから別のテキストボックスに移動しても、ボタンが無効のままであることがわかります。(ただし、textBoxA はボタンの CommandBinding を実装しているため、ボタンを有効にする必要があります)。

これはどのように機能するはずですか?

前もって感謝します。

4

3 に答える 3

0

MSFTは、WPF フォーラムで正しい答えを教えてくれました。

于 2011-03-09T19:59:22.547 に答える
0

あなたのシナリオに当てはめることができるかどうか試してみます:

<Canvas>
    <Button ... Command="Open">
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </Button>
    <TextBox ... >
        <CommandBindings>
            <CommandBinding Command="Open" Executed="OnOpen"/>
        <CommandBindings>
    </TextBox>
    <TextBox ... />
</Canvas>

コード ビハインドでは次のようになります。

private void OnOpen(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Hello");
}

CommandBindings のアイデアは、コンテキスト (通常はユーザー コントロール) 内のボタンやその他のコントロールで共通のキー ストロークを機能させるためのショートカットになることです。次に、各領域は Open コマンドに対して異なる意味を持つことができます (1 つはおそらくファイルを開き、別の領域では ListView で選択された項目を開くなど)。

私の例では、TextBox A またはボタンにフォーカスがあるときに CTRL+O を押すと、'Hello' MessageBox がトリガーされます。しかし、より深い説明については、Leom がリンクしているページを読んでください。

于 2010-06-21T19:51:08.233 に答える
0

これがどのように機能するかわかりません。ポイントが欠けているようです(申し訳ありません)-CommandBindingsは親要素に適用されるはずです(キャンバスに配置しても機能します)。ボタンがクリックされると、RoutedCommand がビジュアル ツリーを介して「バブルアップ」します。これは、すべての親要素で、このコマンドにバインドされたイベントが発生することを意味します。ボタンが無効になっている理由は、その時点で open コマンドを実行できず、CommandBinding が実行パスにないため評価されていないためです。ここを参照してください:

http://msdn.microsoft.com/en-us/library/system.windows.input.commandbinding.aspx

于 2010-06-21T16:16:29.907 に答える