Getting events from checked out WPF ComboBox

Next to the complete WPF noob. So I connected the combobox to have checkboxes using the following item template:

<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>

      

In a real human event, by clicking the checkbox, I will catch the event in the chkDayName_Click method. I have the following questions:

How can I find out the values ​​of the corresponding TextBlock in the element template? How do I find out the index of the element that was clicked?
Is there a way to get to the parent?

Thanks.

0


a source to share


2 answers


If I understand this, you want to know which elements of the lists are matched? You can use chkDayName_Click for this and add the day name as a tag for the CheckBox. This is very similar to Winforms. In WPF, you usually allow the binding handle to function this way. Below is the code that will display the selected item in a text box and a list of marked business days.

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>

      



Code behind:

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; }
    }
}

      

+2


a source


You can try ComboBox SelectedIndex or SelectedValue to indicate SelectedItem. In MVVM mode, you can have a two way binding between the SelectedIndex and one of your ViewModel properties.



0


a source







All Articles