2009-05-14 13 views
0

WPF noobの近くにあります。だから私は、次の項目テンプレートを使用してチェックボックスを持つコンボボックスをフックアップ: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

私が理解している場合は、どのコンボボックスの項目がチェックされているか知りたいですか?そのためにchkDayName_Clickを使用して、その日の名前をCheckBoxのタグとして追加することができます。これは非常に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; } 
    } 
} 
0

あなたはのSelectedItemを伝えるためのComboBoxのselectedIndexまたはSelectedValueのを試すことができます。 MVVMのやり方では、SelectedIndexとViewModelのいずれかのプロパティの間に双方向バインディングを設定できます。

関連する問題