2013-03-12 25 views
6

Birden çok Metin Kutusu içeren Kılavuzum var. Kullanıcıya odaklanabilecek eylemlere bağlı olarak, metin kutularından birine değiştirilmelidir. Geçerli çözümüm, ViewModel'de bir string özelliğini ve odağı değiştirmek için xaml'de bir veri tetikleyicisi kullanıyor. Güzel çalışıyor ama bunu başarmak için oldukça dolambaçlı bir yol gibi görünüyor, bu yüzden daha açık bir şekilde yapılabilir mi diye merak ediyordum? Eğer özelliğinin değeri ve elemanın adını görebileceğiniz gibiOdağı WPF'de MVVM ile ayarlama

<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> 

aynıdır bu yüzden yerine eleman başına bir tetiği olan bu i tek tetik yapmak istiyorum.

Belki birisi daha temiz bir şekilde ortaya çıkabilir? peşin

+0

Odağı neden bu şekilde ayarladığınızı sorabilir miyim? Kullanıcı TabIndex tarafından Sekme tarafından da ayarlanabildiğinden, bu çözüm sizin için çalıştığından sadece bir kez odağı – WiiMaxx

+1

ayarlayabilmeniz gerektiğinden, bunu – blindmeis

+2

almalısınız. Şahsen odak UI'ye özgü bir kavramdır. tüm odak noktalarım ViewModel'imde değil, görünümün arkasındaki kodda işleniyor (odaklama iş mantığında belirli bir anlamı olmadıkça). – Rachel

cevap

4

yılında

teşekkürler benim projelerden biri de odak ayarı ele yolu odak uzantısı (Ben bundan orijinal yayını görme nerede hatırlamıyorum özür dileriz) kullanarak oldu.

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(); 
      } 
     } 
    } 

Ve sonra xaml dosyasında bir Bağımlılık Mülkiyet olarak kullanmak:

<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}" /> 

Daha sonra odaklamayı ayarlamak için bağlayıcı kullanabilirsiniz.

+1

Teşekkürler. Bunun gibi bir çözüm kullanmayı düşündüm ama sanal makinemi gerçek kullanıcı arayüzüne çok güçlü bir şekilde bağladığı için buna karşı karar verdim. Geride kalan kodların muhtemelen hepsinden sonra gitmenin yolu olduğunu düşünmeye başladım. – Farawin

+0

Metin kutunuzun ayrıca Odaklanabilme = "Doğru" ayarının olması gerekir, aksi halde bu işe yaramaz – krilovich

+1

http://stackoverflow.com/questions/1356045/set-focus-on-textbox-in- wpf-den-view model c-wpf –