从WPF Checked ComboBox获取事件

时间:2009-05-14 17:26:43

标签: wpf events combobox

接近WPF总数。所以我使用以下项目模板连接一个组合框以获得复选框:

<ComboBox.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal">
            <CheckBox Checked="{Binding IsSelected}"
                   Width="20" Name="chkDayName" Click="chkDayName_Click"/>
            <TextBlock Text="{Binding DayOfWeek}"
                   Width="100"  Name="txtDayName" />
        </StackPanel>
    </DataTemplate>
</ComboBox.ItemTemplate>

在单击复选框的人的实际事件中,我在chkDayName_Click方法中捕获事件。我有以下问题:

如何在项目模板中找到相应TextBlock的值? 如何找到被点击的项目的索引?
有没有办法找到父母?

感谢。

2 个答案:

答案 0 :(得分:2)

如果我理解你想知道检查了哪些组合框项目?您可以使用chkDayName_Click,并将当天的名称添加为CheckBox的Tag。这感觉非常Winforms。在WPF中,您通常会让您的数据绑定处理功能如下。下面是一些代码,它们将在文本框中显示所选项目,并显示已检查工作日的列表。

XAML:

<Window x:Class="DayComboBoxDemo.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <Window.Resources>

        <CollectionViewSource x:Key="checkedWeekdays" Source="{Binding Path=WeekDays}" Filter="IsCheckedFilter" />

    </Window.Resources>

    <StackPanel>
        <ComboBox
            ItemsSource="{Binding Path=WeekDays}"
            SelectedItem="{Binding Path=SelectedWeekDay}">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <CheckBox 
                            IsChecked="{Binding Path=IsChecked}"
                            Width="20" Click="chkDayName_Click"/>
                        <TextBlock 
                            Text="{Binding DayOfWeek}" Width="100" />
                    </StackPanel>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox>
        <TextBlock Text="{Binding Path=SelectedWeekDay.DayOfWeek}" />
        <ListBox
            DisplayMemberPath="DayOfWeek"
            ItemsSource="{Binding Source={StaticResource checkedWeekdays}}" />
    </StackPanel>
</Window>

代码背后:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Data;

namespace DayComboBoxDemo
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            List<WeekDay> weekDays = new List<WeekDay>();
            foreach (DayOfWeek dayOfWeek in System.Enum.GetValues(typeof(DayOfWeek)))
            {
                weekDays.Add(new WeekDay() { DayOfWeek = dayOfWeek });
            }

            WeekDays = weekDays;

            _checkedWeekdays = FindResource("checkedWeekdays") as CollectionViewSource;

            DataContext = this;
        }

        public IEnumerable<WeekDay> WeekDays { get; set; }

        public WeekDay SelectedWeekDay
        {
            get { return (WeekDay)GetValue(SelectedWeekDayProperty); }
            set { SetValue(SelectedWeekDayProperty, value); }
        }

        public static readonly DependencyProperty SelectedWeekDayProperty =
            DependencyProperty.Register("SelectedWeekDay", 
                                        typeof(WeekDay), 
                                        typeof(Window1), 
                                        new UIPropertyMetadata(null));

        private void chkDayName_Click(object sender, RoutedEventArgs e)
        {
            _checkedWeekdays.View.Refresh();
        }

        private void IsCheckedFilter(object sender, FilterEventArgs e)
        {
            WeekDay weekDay = e.Item as WeekDay;
            e.Accepted = weekDay.IsChecked;
        }

        private CollectionViewSource _checkedWeekdays;
    }

    public class WeekDay
    {
        public DayOfWeek DayOfWeek { get; set; }
        public bool IsChecked { get; set; }
    }
}

答案 1 :(得分:0)

您可以尝试使用ComboBox的SelectedIndex或SelectedValue来告诉SelectedItem。在MVVM方式中,您可以在SelectedIndex和ViewModel属性之间进行双向绑定。