2017-03-21 10 views
3

TextBoxを含むListViewがあり、ユーザーがTextBoxの1つをクリックするたびに選択項目を設定したいと思います。UWPでXAMLを使用してListView選択項目を設定するためのトリガー

これまで私が試したことは次のとおりです。

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

問題はスタイルトリガーがUWPではサポートされていないことです。私はこれを達成できる他の方法がありますか?

+0

私はそれを試していません。私はそれがどのように助けることができるかはわかりません。 –

+0

ええ、それは助けになりません - 私はあなたのサンプルを試して、今問題を理解しています。 – Romasz

答えて

3

通常、Triggersは、Behaviorsで置き換えることができます。ここに例があります -

最初に、あなたが持っていない場合は、このnugetパッケージをインストールする必要があります。

次に、これらの名前空間をXAMLに追加します。

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

これらの名前空間で、あなたは今、あなたが以前にインストールさnugetパッケージに付属EventTriggerBehaviorを使用することができます。基本的には、選択を制御するすべてのTextBoxに接続する必要があります。この場合には何EventTriggerBehavior

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

TextBoxのイベントGotFocusが呼び出されるたびに、SelectSelectorItemAction呼ばIActionは(IAction.Executeを介して)実行される、です。このSelectSelectorItemActionは、ビルドする必要がある唯一のものです。

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

コードはかなり簡単です。すべては、ビジュアルツリーを検索し、の基本クラスであるSelectorItemにあります。この方法で同じSelectSelectorItemActionGridViewに再利用することもできます。

関連する問題