2016-09-28 39 views
0

在我的應用程序中,我有一個UserControl,它代表對象的某種配置。在這裏面是一個包含所述對象名稱的Texblock。我希望能夠點擊這個Textblock並將它變成一個文本框,以便您可以編輯名稱。如何在單擊文本框時更新文本框的綁定

我希望它有以下3種行爲

  1. 設置當按下回車鍵
  2. 增益鍵盤焦點變爲可見時
  3. 在視圖模型中的值與視圖模型設定值時,鼠標點擊文本框外(像一個組合框)

,我目前卡在3. 如何讓我的文本框滿足要求uirement 3 - 點擊文本框設置值我已經實現了一些附件行爲,使其他2工作,但不能讓鼠標工作。

我曾嘗試以下

  1. 新增PreviewMouseDown事件 - 這似乎只在按下鼠標是在文本框中
  2. 新增PreviewMouseDown甚至在用戶控件,以獲得被檢測的 - 這似乎得到連撞當文本框被點擊。它也不是我窗口中唯一的用戶控件,所以它不會在更大的範圍內工作。
  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只有當你點擊另一個文本框或組合框而不是僅僅點擊它時,它才起作用。這就是我在Lost Binding和作爲事件時所指的意思,在寫它時我忘記了確切的名字,所以我將它編輯得更加清晰。謝謝 – Keithin8a

+0

好的,所以你的意思是當你點擊你的用戶控件中的任何地方,而不是在另一個控件中,我是對的嗎?那麼你爲什麼不讓自己的用戶控件可以聚焦?我認爲這是更簡單的方法... – Pikoh

回答

0

我設法找到解決方案。

基本上我在我的代碼中爲文本框的OnGotFocus綁定了一個事件。當它碰到這個方法時,它爲MouseControl和MouseLeave添加一個事件給usercontrol。所以當你點擊usercontrol中的任何地方時,它會更新文本框的內容。

如果您離開usercontrol的界限,那麼您想要將鼠標向下移動到窗口本身。同樣,當您移回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; 

    }