2016-09-28 2 views
0

В моем приложении у меня есть Usercontrol, который представляет некоторую конфигурацию для объекта. Внутри это Texblock, который содержит имя указанного объекта. Я хотел иметь возможность щелкнуть по этому текстовому блоку и превратить его в текстовое поле, чтобы вы могли редактировать имя.Как обновить привязку текстового поля при нажатии на текстовое поле

Я хочу, чтобы иметь следующие 3 поведения

  1. Устанавливает значение в ViewModel при входе нажатия
  2. Gain клавиатурного фокуса, когда он становится видимым
  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 постов и ни один из них не кажется, чтобы быть в состоянии помочь мне с этим, все они рекомендуют добавлять его в окно/UserControl, который я не могу сделать.

+4

Как насчет установки 'UpdateSourceTrigger' на' LostFocus'? – Pikoh

+0

@Pikoh Это работает только тогда, когда вы нажимаете на другое текстовое поле или поле со списком, а не просто нажимаете на него. То, что я имел в виду у LostFocus как для Binding, так и для Event, не мог вспомнить точное имя, когда писал, поэтому я отредактирую его, чтобы быть более понятным. Спасибо – Keithin8a

+0

Итак, вы имеете в виду, когда вы нажимаете в любом месте своего пользовательского элемента управления, а не только на другой элемент управления, верно? то почему бы вам не сделать свой пользовательский контроль ориентированным? Я думаю, что это проще ... – Pikoh

ответ

0

Мне удалось найти решение.

В основном я связал событие в своем коде для OnGotFocus текстового поля. Когда он ударяет по этому методу, он добавляет событие для MouseDown и MouseLeave в 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; 

    } 
Смежные вопросы