4

簡略化: 私の見解では、ボタンとある種の TextBox を含む xaml ページがあります。ボタンは ViewModel の DelegateCommand にバインドされ、編集ボックスは ViewModel のプロパティにバインドされます。

View:
<Button Command="{Binding MyCommand}"/>
<TextBox Text="{Binding MyString}"/>

ViewModel:
public DelegateCommand MyCommand { get; set; }
public String MyString { get; set; }

ユーザーがボックスに何かを入力してボタンをクリックすると、ボタンはフォーカス変更イベントを受け取りません。したがって、そのコンテンツはプロパティに更新されません。そのため、プロパティ MyString は、ボタンをクリックしたときに TextBox の内容を反映しません。そのため、MyCommand がどのような処理を行っていても、現在の入力ではなく古いデータを処理しています。

これが本当にただの TextBox である場合は、バインディングに UpdateSourceTrigger=PropertyChanged を追加します。ただし、この場合、編集コントロールはもう少し複雑で、コンテンツに対して何らかの検証を行う必要があります。そのため、マウスでボタンを押すときに、ある種の「フォーカスが失われた」信号が必要です。

私の問題は: MVVM では、ボタンの背後にあるコードはビューにアクセスできないため、フォーカスを失うことはできません。

マウスでクリックしたときにボタンにキーボードフォーカスを取得させる方法は xaml (ビューなど) にありますか? これは、カスタム コントロールが「フォーカスを失った」というメッセージを取得する最も簡単な方法です。

4

2 に答える 2

3

Re:xaml(ビューなど)で、ボタンがマウスでクリックされたときにキーボードのフォーカスを取得する方法はありますか?>ボタンは、クリックされたときにキーボードフォーカスを受け取ります– IsEnabled、Focusable、およびIsHitTestVisibleプロパティがデフォルトですべてtrueに設定されている場合。プログラムでキーボードフォーカスを設定するには、次の例に示すようにKeybaord.Focusを呼び出します。

一般的なミームとは異なり、コマンドはVMで処理する必要はありません。コマンドの実行時に、VMとは別にビューを変更する必要がある場合は、コマンドをビューで処理できます。実際、これはWPFのネイティブパターンです。

次の例は、ボタンのCommandプロパティを使用して、ビュー内のコマンドを処理する方法を示しています。簡単にするために、この例にはVMがありません。コマンドはビューで処理されますが、VMが存在する場合、ビューの背後にあるコードがVMを呼び出す可能性があります。

public partial class MainWindow : Window
{
    public static readonly RoutedUICommand MyCommand = new RoutedUICommand("My Command", "MyCommand", typeof(MainWindow));
    public String MyString { get; set; }

    public MainWindow()
    {
        MyString = "some text";
        DataContext = this; // this simple example has no VM 
        InitializeComponent();
    }
    private void MyCommand_Executed(object sender, ExecutedRoutedEventArgs e)
    {
        Button1.Content = MyString;
        Keyboard.Focus(Button1);   
    }
}
<Window x:Class="fwLoseFocus.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:me="clr-namespace:fwLoseFocus">
    <Window.CommandBindings>
        <CommandBinding Command="me:MainWindow.MyCommand" Executed="MyCommand_Executed"/>
    </Window.CommandBindings>
    <StackPanel>
        <TextBox Text="{Binding MyString}"/>
        <Button x:Name="Button1" Command="me:MainWindow.MyCommand"/>
    </StackPanel>
</Window>
于 2012-08-21T14:29:47.500 に答える
1

Button のクリック イベントを引き続き保持し、コード ビハインドによってテキスト ボックスのフォーカスが失われることはありませんか?

private void Button_Click(object sender, RoutedEventArgs e) { 
    FocusManager.SetFocusedElement(this, null); 
} 

次の答えはあなたに当てはまりますか?

WPFボタンクリックでフォーカスをリセット

于 2012-08-21T13:18:07.430 に答える