C# 如何在单击ItemTemplate中的按钮/文本框时更改listbox的选定项?
在WPF项目中,我有一个C# 如何在单击ItemTemplate中的按钮/文本框时更改listbox的选定项?,c#,wpf,xaml,listbox,C#,Wpf,Xaml,Listbox,在WPF项目中,我有一个ListBox,它的itemsource绑定到一组项。我在列表框的ItemTemplate中使用DataTemplate来表示这些项的UI 我想做的是,当用户点击绑定项的DataTemplate的任何部分时,列表框。SelectedItem被设置为其DataTemplate所在的项。然后将应用所选的样式。正如您可以从下面的示例代码中看到的,单击标签就可以了。但是,诸如按钮和文本框等控件的行为并不符合要求,毫无疑问还有其他控件。我怀疑这和专注有关 我怎样才能做到这一点 XA
ListBox
,它的itemsource
绑定到一组项。我在列表框的ItemTemplate
中使用DataTemplate
来表示这些项的UI
我想做的是,当用户点击绑定项的DataTemplate的任何部分时,列表框。SelectedItem
被设置为其DataTemplate
所在的项。然后将应用所选的样式。正如您可以从下面的示例代码中看到的,单击标签就可以了。但是,诸如按钮
和文本框
等控件的行为并不符合要求,毫无疑问还有其他控件。我怀疑这和专注有关
我怎样才能做到这一点
XAML:
您可以为模板中的Border
元素处理PreviewMouseLeftButtonDown
事件,并显式选择相应的项:
private void Border_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Border border = sender as Border;
lvv.SelectedItem = border.DataContext;
}
Hi@mm8,感谢您的回复。很好!干杯想知道是否有一个XAML唯一的解决方案来避免代码落后?
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
// Dummy items to generate 4 items in ListBox
DataContext = new object[] { 1, 2, 3, 4 };
}
}
private void Border_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
Border border = sender as Border;
lvv.SelectedItem = border.DataContext;
}
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ListBoxItem">
<Border Name="Border" Padding="2" SnapsToDevicePixels="true"
PreviewMouseLeftButtonDown="Border_PreviewMouseLeftButtonDown">
<ContentPresenter />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="true">
<Setter TargetName="Border" Property="BorderBrush" Value="Blue"/>
<Setter TargetName="Border" Property="BorderThickness" Value="1"/>
<Setter Property="FontWeight" Value="Bold" />
<Setter Property="Foreground" Value="Black" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>