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