gpt4 book ai didi

silverlight - Silverlight如何在数据模板中使用按钮时提升列表框的选定项目

转载 作者:行者123 更新时间:2023-12-03 10:55:40 26 4
gpt4 key购买 nike

在列表框控件中,我有一个包含文本和按钮的数据模板。鉴于Silverlight/WPF的性质,当我单击列表框项目中的按钮时,在选择列表框项目之前会捕获按钮事件。因此,如果我尝试传递所选列表框项目的记录ID,则当前只能通过首先单击并选择列表框项目,然后单击按钮来进行。

有没有一种方法可以促进对列表框项目的选择,因此在创建列表框项目时,我可以单击列表框项目中的按钮,并可以调用某些事件(selectionChanged?),这将允许我捕获所选内容记录id并将其用于其他操作(作为方法中的参数传递等等)。我为此实现使用了简单MVVM工具包,因此我想知道是否可以在viewModel中进行处理,或者是否需要在后面的控件代码中进行处理,然后将选择插入viewModel。

列表框控件显示为:

<ListBox x:Name="ResultListBox"
HorizontalAlignment="Stretch"
Background="{x:Null}"
Grid.Row="1"
BorderThickness="0" HorizontalContentAlignment="Stretch"
ItemContainerStyle="{StaticResource ListBoxItemStyle1}"
ItemsSource="{Binding SearchResults[0].Results}"
ScrollViewer.HorizontalScrollBarVisibility="Disabled"
Style="{StaticResource ListBoxStyle1}">

<ListBox.ItemTemplate>

<DataTemplate>
<dts:TypeTemplateSelector Content="{Binding}" HorizontalContentAlignment="Stretch">
<!-- Template 1 -->
<formatter:TypeTemplateSelector.CFSTemplate>
<DataTemplate>
<qr:ucIndex_Product />
</DataTemplate>
</formatter:TypeTemplateSelector.CFSTemplate>

<!-- Template 2 -->
<formatter:TypeTemplateSelector.PersonTemplate>
<DataTemplate>
<qr:ucIndex_Person />
</DataTemplate>
</formatter:TypeTemplateSelector.PersonTemplate>

</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>

在数据模板(用户控件)中,包含按钮以及许多其他字段。除非有要求,否则我暂时将省略该代码。

提前致谢!

最佳答案

把它放在你的ListBox.Resources

<Style TargetType="{x:Type ListBoxItem}">
<EventSetter Event="PreviewGotKeyboardFocus" Handler="SelectCurrentItem"/>
</Style>

而这在后面的代码中
protected void SelectCurrentItem(object sender, KeyboardFocusChangedEventArgs e)
{
ListBoxItem item = (ListBoxItem)sender;
item.IsSelected = true;
}

您也可以使用以下代码,而不使用后台代码,但是只要它具有KeyBoard焦点,它只会保持ListBoxItem处于选中状态。焦点移开后,该项目变为未选中状态
<Style TargetType="ListBoxItem">
<Style.Triggers>
<Trigger Property="IsKeyboardFocusWithin" Value="True">
<Setter Property="IsSelected" Value="True" />
</Trigger>
</Style.Triggers>
</Style>

编辑

由于Silverlight没有EventSetter,因此您可以使用ListBox的Loaded事件,并将以下内容添加到代码中:
private void ResultListBox_Loaded(object sender, RoutedEventArgs e)
{
ListBox list = (ListBox)sender;
list.GotFocus += ResultListBox_GotFocus;
}

void ResultListBox_GotFocus(object sender, RoutedEventArgs e)
{
var item = FindAncester<ListBoxItem>((DependencyObject)e.OriginalSource);
if (item != null) item.IsSelected = true;
}

T FindAncester<T>(DependencyObject current)
where T : DependencyObject
{
current = VisualTreeHelper.GetParent(current);

while (current != null)
{
if (current is T)
{
return (T)current;
}
current = VisualTreeHelper.GetParent(current);
};
return null;
}

这将捕获ListBox的Focus事件,获取触发焦点事件的控件,并遍历可视树以查找 ListBoxItem对象,并将其Selected值设置为true。

关于silverlight - Silverlight如何在数据模板中使用按钮时提升列表框的选定项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7013538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com