WPF 实现一个带分组的下拉框,并且支持下拉选项的点击事件,要求代码正确,请给出代码示例
时间: 2024-11-24 15:41:51 浏览: 50
在WPF中,你可以使用`ItemsControl`和`ComboBox`结合`DataTemplate`来创建一个带分组的下拉框,同时监听`SelectionChanged`事件来处理选项的点击。下面是一个简单的示例代码:
```xml
<!-- XAML 文件 -->
<Window x:Class="YourNamespace.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Grid>
<StackPanel>
<!-- 分组的下拉框 -->
<ComboBox x:Name="GroupedComboBox" ItemsSource="{Binding Items}"
DisplayMemberPath="GroupName"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
<ComboBox.ItemContainerStyle>
<Style TargetType="ComboBoxItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding GroupName}" Margin="5,0,0,0"/>
<Rectangle Width="10" Height="10" Margin="5,0,5,0" Fill="#FFAAAAAA"/>
<ContentPresenter Content="{Binding}" Margin="5,0,0,0"/>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ComboBox.ItemContainerStyle>
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical">
<TextBlock Text="{Binding Name}"/>
<!-- 添加一个点击事件处理器 -->
<Button Content="Select" Click="OnOptionClick"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<!-- 显示选中的项 -->
<TextBlock Text="Selected Item: {x:Static local:Resources.SelectedGroupName} - {SelectedItem.Name}"/>
</StackPanel>
</Grid>
</Window>
```
```csharp
// C# 后台文件 (MainWindow.xaml.cs)
using System.Collections.Generic;
using System.Windows;
namespace YourNamespace {
public partial class MainWindow : Window {
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register("Items", typeof(IEnumerable<ItemWithGroup>), typeof(MainWindow), new FrameworkPropertyMetadata(default(IEnumerable<ItemWithGroup>)));
public static readonly DependencyProperty SelectedItemProperty = DependencyProperty.Register("SelectedItem", typeof(ItemWithGroup), typeof(MainWindow), new FrameworkPropertyMetadata(null));
public IEnumerable<ItemWithGroup> Items {
get => (IEnumerable<ItemWithGroup>)GetValue(ItemsProperty);
set => SetValue(ItemsProperty, value);
}
public ItemWithGroup SelectedItem {
get => (ItemWithGroup)GetValue(SelectedItemProperty);
set => SetValue(SelectedItemProperty, value);
}
// 点击选项的事件处理
private void OnOptionClick(object sender, RoutedEventArgs e) {
var button = sender as Button;
if (button != null && button.DataContext is ItemWithGroup item) {
SelectedItem = item;
// 在这里可以进一步处理选择项的操作
}
}
}
// 假设ItemWithGroup是一个自定义类,包含GroupName和Name属性
public class ItemWithGroup {
public string GroupName { get; set; }
public string Name { get; set; }
}
}
```
在这个例子中,`Items`绑定到一个包含`GroupName`和`Name`的集合,每个组内有一个按钮用于模拟点击事件。当你选择一个选项时,`SelectedItem`会被更新,并触发`OnOptionClick`事件。
阅读全文