2016-09-28 22 views
0

私のアプリケーションでは、オブジェクトのいくつかの構成を表すUsercontrolがあります。この内部には、前記オブジェクトの名前を含むTexblockがあります。このTextblockをクリックしてテキストボックスにして、名前を編集できるようにしたかったのです。テキストボックスをクリックしたときにテキストボックスのバインドを更新する方法

は、私はそれが

  1. はそれが
  2. 見えるようになったときに
  3. ゲインキーボードフォーカスを押下するViewModelにに値を設定し、次の3つの行動をしたいのViewModelに値を設定するときマウスは、テキストボックスの外でクリックされた(コンボボックスがないように)

と3 はどのように私は私のテキストボックスがREQを満たすために得ることができる上、私は現在、立ち往生していますuirement 3 - テキストボックスをクリックすると値が設定される他の2つの動作を動作させるためにいくつかの動作を実装しましたが、マウスを動作させることはできません。

私は、次の

  1. 追加PreviewMouseDownイベントを試してみました - これは場合にも打撃を受けるように思われる - これが唯一のマウスダウンがテキストボックスにもユーザーコントロールで
  2. 追加PreviewMouseDownのときに検出され得るように思われますテキストボックスがクリックされます。また、それは私のウィンドウ内の唯一のusercontrolではないので、それはより大きなスケールでは動作しません。
  3. PreviewMouseDownOutsideCapturedElementを追加しましたが、これを決して発射することはできません。
  4. UpdateSourceTriggerとイベントの両方に焦点を紛失 - これは動作しますが、あなたではなく、単に次のように私のテキストボックスのコードがある

をオフクリックするよりも、別の入力フィールドをクリックしたときのみ。

  <TextBox x:Name="text" VerticalAlignment="Center" 
       Margin="5,2,0,0" 
       Text="{Binding Name, Mode=TwoWay}" 
       Visibility="{Binding IsEditingName, Converter={StaticResource VisConverter}, FallbackValue=Collapsed}" 
       b:FocusBehaviours.ShouldFocusWhenVisible="True" 
       b:InputBehaviours.UpdatePropertySourceWhenEnterPressed="TextBox.Text"/> 

私は数え切れないほどのSOの記事を見てきましたし、それらのどれもこれで私を助けることができるように思わない、それらはすべて私が行うことができないウィンドウ/ユーザーコントロールに追加することをお勧めします。

+4

'UpdateSourceTrigger'を' LostFocus'に設定するのはどうですか? – Pikoh

+0

@Pikohこれは、単にクリックするのではなく、別のテキストボックスまたはコンボボックスをクリックしたときにのみ機能します。 LostFocusがBindingとEventの両方で意味することは、私がそれを書いていたときの正確な名前を思い出すことができなかったので、もっと明確に編集します。ありがとう – Keithin8a

+0

あなたは、別のコントロールだけでなく、あなたのユーザーコントロールのどこかをクリックすると、そうですか?あなたのユーザーコントロールをフォーカス可能にしてみませんか?私はそれがより簡単な方法だと思う... – Pikoh

答えて

0

私は解決策を見つけることができました。

基本的に、テキストボックスのOnGotFocusのために、自分のコードでイベントをバインドしました。このメソッドにヒットすると、MouseDownおよびMouseLeaveのイベントがusercontrolに追加されます。したがって、ユーザコントロールの任意の場所をクリックすると、テキストボックスの内容が更新されます。

ユーザーコントロールの境界を離れる場合は、マウスダウンイベントをウィンドウ自体に移動する必要があります。同様に、ユーザーコントロールに戻ったときに、ウィンドウ上のマウスダウンイベントを削除するか、離した後にテキストボックスに戻るときに値を設定します。

ここに自分のコードを追加しましたが、似たような問題が発生している可能性があるのは間違いありません。

私は、コードの背後にあるコードを使用するよりも良い方法がなければならないと確信していますが、ここでMVVMの原則を破っているとは思わないので、私は安全です。

 private void View_OnMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     updateTextbox(); 
    } 

    private void View_OnMouseLeave(object sender, MouseEventArgs e) 
    { 
     Window parentWindow = Window.GetWindow(this); 

     if (parentWindow != null) 
     { 
      Mouse.AddPreviewMouseDownHandler(parentWindow, ParentWindow_OnMouseDown); 
     } 
    } 

    private void View_OnMouseEnter(object sender, MouseEventArgs e) 
    { 
     Window parentWindow = Window.GetWindow(this); 

     if (parentWindow != null) 
     { 
      Mouse.RemovePreviewMouseDownHandler(parentWindow, ParentWindow_OnMouseDown); 
     } 
    } 

    private void ParentWindow_OnMouseDown(object sender, MouseButtonEventArgs mouseButtonEventArgs) 
    { 
     Window parentWindow = Window.GetWindow(this); 

     if (parentWindow != null) 
     { 
      Mouse.RemovePreviewMouseDownHandler(parentWindow, ParentWindow_OnMouseDown); 
     } 
     updateTextbox(); 
    } 

    private void updateTextbox() 
    { 
     Keyboard.Focus(this); 
    } 

    private void Text_OnGotFocus(object sender, RoutedEventArgs e) 
    { 
     MouseDown += View_OnMouseDown; 
     MouseLeave += View_OnMouseLeave; 
     MouseEnter += View_OnMouseEnter; 
    } 

    private void Text_OnLostFocus(object sender, RoutedEventArgs e) 
    { 
     BindingOperations.GetBindingExpression(text, TextBox.TextProperty).UpdateSource(); 
     MouseDown -= View_OnMouseDown; 
     MouseLeave -= View_OnMouseLeave; 
     MouseEnter -= View_OnMouseEnter; 

    }