触发通过UWP中的XAML设置ListView所选项目

时间:2017-03-21 10:36:28

标签: .net xaml uwp uwp-xaml

我有一个包含TextBoxes的ListView,我想在用户点击其中一个TextBox时设置所选项目。

这是我到目前为止所尝试的内容。

<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不支持样式触发器。还有其他方法可以达到这个目的吗?

1 个答案:

答案 0 :(得分:3)

通常,Trigger可以由Behavior替换。这是一个例子 -

首先,如果你还没有安装这个nuget软件包,你需要安装它。

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

然后,您希望将这些命名空间添加到XAML。

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

使用这些命名空间,您现在可以使用先前安装的 nuget 包附带的EventTriggerBehavior。您基本上需要将其附加到控制选择的所有TextBox es。

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

在这种情况下EventTriggerBehavior的作用是,每当调用GotFocus的事件TextBox时,都会执行一个名为IAction的{​​{1}}(通过SelectSelectorItemAction)。这IAction.Execute是唯一需要构建的东西。

SelectSelectorItemAction

代码非常简单。它所做的只是搜索 Visual Tree 并找到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的基类。这样,您也可以为ListViewItem重复使用相同的SelectSelectorItemAction