在UWP中通过XAML设置ListView选定项的触发器

3

我有一个包含文本框的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不支持样式触发器。有没有其他方法可以实现这个功能?

我还没有尝试过。我不明白它如何有所帮助。 - Connell.O'Donnell
是的,那样做没有帮助 - 我已经尝试了你的示例,现在明白了问题所在。 - Romasz
1个回答

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

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

在这种情况下,EventTriggerBehavior 的作用是,每当 TextBox 的事件 GotFocus 被调用时,将执行一个名为 SelectSelectorItemActionIAction(通过 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);
    }
}

这段代码非常简单明了。它所做的就是搜索 Visual Tree 并定位到 SelectorItem,这是 ListViewItem 的基类。这样你就可以在 GridView 中重复使用相同的 SelectSelectorItemAction


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接