2017-03-21 5 views
3

Ich habe eine ListView mit TextBoxes und ich möchte das ausgewählte Element immer wenn ein Benutzer klickt innerhalb einer der Textfelder gesetzt.Auslöser, um ListView ausgewähltes Element über XAML in UWP

Hier ist, was ich bisher versucht habe.

<StackPanel Orientation="Vertical"> 

      <TextBlock Text="Name Serial"/> 
      <ListView ItemsSource="{Binding Items, Mode=OneWay}" 
         SelectedItem="{x:Bind VM.SelectedItem, Mode=TwoWay}"> 
       <ListView.Resources> 
        <Style TargetType="ListViewItem"> 
         <Style.Triggers> 
          <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
           <Setter Property="IsSelected" Value="True"/> 
          </Trigger> 
         </Style.Triggers> 
        </Style> 
       </ListView.Resources> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <StackPanel Orientation="Horizontal"> 
          <TextBox Text="{Binding Name, Mode=TwoWay}"/> 
          <TextBox Text="{Binding Serial, Mode=TwoWay}"/> 
         </StackPanel> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </StackPanel> 

Das Problem ist Stil Auslöser werden in UWP nicht unterstützt. Gibt es eine andere Möglichkeit, dies zu erreichen?

+0

Ich habe es nicht versucht. Ich sehe nicht, wie es helfen könnte. –

+0

Ja, das wird nicht helfen - Ich habe Ihre Probe versucht und verstehe jetzt das Problem. – Romasz

Antwort

3

Im Allgemeinen kann Trigger s durch Behavior s ersetzt werden. Hier ist ein Beispiel -

Zuerst müssen Sie dieses nuget Paket installieren, wenn Sie es nicht haben.

Install-Package Microsoft.Xaml.Behaviors.Uwp.Managed 

Dann möchten Sie diese Namespaces zu Ihrem XAML hinzufügen.

xmlns:Interactivity="using:Microsoft.Xaml.Interactivity" 
xmlns:Core="using:Microsoft.Xaml.Interactions.Core" 

Mit diesen Namensräumen, können Sie jetzt die EventTriggerBehavior verwenden, die mit dem zuvor installierten nuget Paket kommt. Sie müssen es im Grunde an alle Ihre TextBox es, die die Auswahl steuern.

<TextBox> 
    <Interactivity:Interaction.Behaviors> 
     <Core:EventTriggerBehavior EventName="GotFocus"> 
      <local:SelectSelectorItemAction /> 
     </Core:EventTriggerBehavior> 
    </Interactivity:Interaction.Behaviors> 
</TextBox> 

Was EventTriggerBehavior in diesem Fall tut, ist, wann immer das Ereignis GotFocus der TextBox aufgerufen wird, ein IAction genannt SelectSelectorItemAction (via IAction.Execute) ausgeführt wird. Diese SelectSelectorItemAction ist die einzige Sache, die Sie bauen müssen.

public class SelectSelectorItemAction : DependencyObject, IAction 
{ 
    public object Execute(object sender, object parameter) 
    { 
     var textBox = (FrameworkElement)sender; 
     var selectorItem = textBox.GetParent<SelectorItem>(); 

     selectorItem.IsSelected = true; 
     return true; 
    } 
} 

public static class Extensions 
{ 
    public static T GetParent<T>(this DependencyObject element) where T : DependencyObject 
    { 
     var parent = VisualTreeHelper.GetParent(element); 

     // C# 7 pattern matching feature. If you are not using C# 7, change it. 
     if (parent is T p) 
     { 
      return p; 
     } 

     return GetParent<T>(parent); 
    } 
} 

Der Code ist recht einfach. Alles, was es tut, ist die Visual Tree Suche und suchen Sie die SelectorItem, die die Basisklasse von ListViewItem ist. Auf diese Weise können Sie dasselbe SelectSelectorItemAction für GridView auch wiederverwenden.

Verwandte Themen