我需要创建一个由复选框组成的自定义组合框,以显示供用户选择的日历月列表。此应用程序允许用户选择月份,无论何时选择或取消选择月份,都会更新列表框。我遍历组合框的itemsource observate集合,以确定选中的月份。我可能可以使用LINQ来查询集合,而不是手动遍历可观察集合,但那是另一天的事了。如果您想测试这个,只需创建一个名为CustomComboBox的新wpf应用程序(在C中),然后将xaml和C复制并粘贴到您的应用程序中:
<Window x:Class="CustomComboBox.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
</Window.Resources>
<Grid>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30" />
<RowDefinition Height="30"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Grid.Row="0" Content="Select the months:" />
<Label Grid.Column="1" Grid.Row="1" Content="Months selected:" />
<ComboBox x:Name="ComboBoxMonths" Grid.Column="0" Grid.Row="1">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox IsChecked="{Binding Path=monthSelected}" VerticalAlignment="Center" Margin="0,0,4,0" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked" />
<TextBlock Text="{Binding monthName}" VerticalAlignment="Center"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
<ListBox x:Name="ListBoxMonthsChecked" Grid.Column="1" Grid.Row="2">
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding monthName}" VerticalAlignment="Center"/>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
</Grid>
</Window>
c代码:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace CustomComboBox
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public static ObservableCollection<Month> monthList = new ObservableCollection<Month>();
public static ObservableCollection<Month> monthsChecked = new ObservableCollection<Month>();
public MainWindow()
{
InitializeComponent();
this.ComboBoxMonths.ItemsSource = monthList;
this.ListBoxMonthsChecked.ItemsSource = monthsChecked;
//add Months to the ComboBoxMonths
monthList.Add(new Month() { monthSelected = false, monthName = "January", monthNumber = 01 });
monthList.Add(new Month() { monthSelected = false, monthName = "February", monthNumber = 02 });
monthList.Add(new Month() { monthSelected = false, monthName = "March", monthNumber = 03 });
monthList.Add(new Month() { monthSelected = false, monthName = "April", monthNumber = 04 });
monthList.Add(new Month() { monthSelected = false, monthName = "May", monthNumber = 05 });
monthList.Add(new Month() { monthSelected = false, monthName = "June", monthNumber = 06 });
monthList.Add(new Month() { monthSelected = false, monthName = "July", monthNumber = 07 });
monthList.Add(new Month() { monthSelected = false, monthName = "August", monthNumber = 08 });
monthList.Add(new Month() { monthSelected = false, monthName = "September", monthNumber = 09 });
monthList.Add(new Month() { monthSelected = false, monthName = "October", monthNumber = 10 });
monthList.Add(new Month() { monthSelected = false, monthName = "November", monthNumber = 11 });
monthList.Add(new Month() { monthSelected = false, monthName = "December", monthNumber = 12 });
}
public class Month
{
public string monthName { get; set; }
public int monthNumber { get; set; }
private bool _monthSelected;
public bool monthSelected //the checkbox is bound to this
{
get
{
return _monthSelected;
}
set
{
if (value != this._monthSelected)
{
_monthSelected = value;
}
}
}
}
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
monthsChecked.Clear();
foreach (Month m in monthList)
{
if (m.monthSelected == true)
{
monthsChecked.Add(m);
}
}
}
private void CheckBox_UnChecked(object sender, RoutedEventArgs e)
{
monthsChecked.Clear();
foreach (Month m in monthList)
{
if (m.monthSelected == true)
{
monthsChecked.Add(m);
}
}
}
}
}