我需要創建複選框的自定義組合框來顯示用戶選擇的日曆月份列表。這個應用程序將允許用戶選擇月份,每當選擇或取消選擇一個月時,都會更新列表框。我遍歷可觀察的集合,它是組合框的項目源,以確定哪些月份已被檢查。我可以使用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