2009-05-14 7 views
0

Noob WPF presque total. Donc, j'ai accroché un combobox avoir des cases à cocher à l'aide du modèle d'élément suivant:Obtention d'événements à partir du WPF Checked ComboBox

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

Sur l'événement réel d'une personne en cliquant sur une case à cocher, je surprends l'événement dans la méthode chkDayName_Click. J'ai les questions suivantes:

Comment puis-je trouver les valeurs du TextBlock correspondant dans le modèle d'élément? Comment puis-je trouver l'index de l'élément sur lequel on a cliqué?
Existe-t-il un moyen d'accéder au parent?

Merci.

Répondre

2

Si je comprends bien, vous voulez savoir quels éléments de la liste déroulante sont vérifiés? Vous pouvez utiliser le chkDayName_Click pour cela et ajouter le nom du jour comme Tag du CheckBox. Cela se sent très Winforms. Dans WPF, vous laissez normalement votre liaison de données gérer des fonctionnalités comme celle-ci. Voici un code qui affichera l'élément sélectionné dans une zone de texte et une liste des jours de la semaine vérifiés.

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 derrière:

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

Vous pouvez essayer de SelectedIndex de ComboBox ou SelectedValue dire SelectedItem. De la manière MVVM, vous pouvez avoir une liaison bidirectionnelle entre SelectedIndex et l'une de vos propriétés ViewModel.