2013-03-12 10 views
6

Mam siatkę z wieloma polami tekstowymi. W zależności od działań, które użytkownik może podjąć, należy zmienić na jeden z pól tekstowych. Moje bieżące rozwiązanie wykorzystuje właściwość string w ViewModel i wyzwalacz danych w Xaml, aby zmienić ostrość. Działa to ładnie, ale wydaje się raczej okrężną drogą do osiągnięcia tego celu, więc zastanawiałem się, czy można to zrobić w bardziej przejrzysty sposób?Ustawianie ostrości w WPF z MVVM

<Grid.Style> 
     <Style TargetType="Grid"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding FocusedItem}" Value="number"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=number}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding FocusedItem}" Value="name"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=name}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding FocusedItem}" Value="id"> 
        <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=id}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Grid.Style> 

Jak widać wartość nieruchomości, jak i nazwę elementu jest taka sama, więc chciałbym to zrobić í pojedynczy spust zamiast jednego elementu za spust.

Może ktoś może wymyślić czystszy sposób?

góry dzięki

+0

Czy mogę zapytać, dlaczego ustawiasz ostrość w ten sposób? ponieważ użytkownik mógłby również ustawić Tab według 'TabIndex', więc wystarczy ustawić fokus tylko raz – WiiMaxx

+1

, o ile to rozwiązanie działa dla ciebie, powinieneś je wziąć – blindmeis

+2

Osobiście uważam, że Focus to koncepcja specyficzna dla interfejsu użytkownika, więc chciałbym umieścić cała moja obsługa skupienia w kodzie za widokiem, a nie w moim ViewModelu (chyba że fokus miał jakieś określone znaczenie w logice biznesowej). – Rachel

Odpowiedz

4

Sposób, w jaki obsługiwane ustawianie ostrości w jednym z moich projektów było za pomocą rozszerzenia ostrości (przepraszam nie pamiętam gdzie widziałem oryginalny post To jest z).

public static class FocusExtension 
    { 
     public static bool GetIsFocused(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(IsFocusedProperty); 
     } 


     public static void SetIsFocused(DependencyObject obj, bool value) 
     { 
      obj.SetValue(IsFocusedProperty, value); 
     } 


     public static readonly DependencyProperty IsFocusedProperty = 
       DependencyProperty.RegisterAttached(
       "IsFocused", typeof(bool), typeof(FocusExtension), 
       new UIPropertyMetadata(false, OnIsFocusedPropertyChanged)); 


     private static void OnIsFocusedPropertyChanged(DependencyObject d, 
       DependencyPropertyChangedEventArgs e) 
     { 
      var uie = (UIElement)d; 
      if ((bool)e.NewValue) 
      { 
       uie.Focus(); 
      } 
     } 
    } 

A potem w XAML pliku używam go jako zależność własności:

<TextBox Uid="TB1" FontSize="13" localExtensions:FocusExtension.IsFocused="{Binding Path=TB1Focus}" Height="24" HorizontalAlignment="Left" Margin="113,56,0,0" Name="TB_UserName" VerticalAlignment="Top" Width="165" Text="{Binding Path=TB1Value, UpdateSourceTrigger=PropertyChanged}" /> 

Następnie można użyć wiązania, aby ustawić ostrość.

+1

Dzięki. Zastanawiałem się nad użyciem takiego rozwiązania, ale zdecydowałem, że nie jest ono zbyt silne w stosunku do rzeczywistego interfejsu użytkownika. Zaczynam myśleć, że kodowanie z tyłu jest prawdopodobnie najlepszym rozwiązaniem. – Farawin

+0

Twoje pole tekstowe musi również mieć ustawialne Focusable = "True", w przeciwnym razie to nie zadziała – krilovich

+1

Oryginalny post, który moim zdaniem jest http://stackoverflow.com/questions/1356045/set-focus-on-textbox-in- wpf-from-view-model-c-wpf –

Powiązane problemy