我需要创建复选框的自定义组合框来显示用户选择的日历月份列表。这个应用程序将允许用户选择月份,每当选择或取消选择一个月时,都会更新列表框。我遍历可观察的集合,它是组合框的项目源,以确定哪些月份已被检查。我可以使用LINQ查询集合,而不是通过手动迭代可观察集合,但那是另一天。如果你想测试这一点,只需创建一个名为CustomComboBox(在C#)一个新的WPF应用程序,并复制和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);
}
}
}
}
}
无当我更改属性的名称时有所不同。 – 2010-11-12 19:25:34
我编辑了我的解决方案以显示正确绑定的快速示例项目。这听起来像你有什么应该正确绑定属性......但我不认为点击复选框应该设置combobox.selected项属性。在我上面提供的例子中。点击一个项目的复选框会产生与单击文本“Bob”不同的结果。 (后者设置了cboParam3.selecteditem,只需点击一个复选框就会更新MCI对象的Select属性,但不会设置cboParam3.SelectedItem属性,希望这会有所帮助! – Scott 2010-11-12 20:34:21
鉴于我可以检查多个复选框,我得到了多重选择的项目?ComboBox的ItemSource包含我所有的MCI,但是当我检查其中一个复选框时,Selected属性似乎不会被设置为true或false ... – 2010-11-12 20:49:41