2009-05-14 4 views
0

총 WPF 멍청한. 그래서 나는 다음과 같은 항목 템플릿을 사용하여 체크 박스를 가지고 할 수있는 콤보 상자를 엮은 :WPF에서 이벤트 가져 오기 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> 

, 내가 chkDayName_Click 방법에서 이벤트를 잡을 수있어. 다음 질문이 있습니다.

항목 템플릿에서 해당 TextBlock의 값을 어떻게 확인할 수 있습니까? 클릭 한 항목의 색인을 찾는 방법은 무엇입니까?
부모에게 연락 할 수있는 방법이 있습니까?

감사합니다.

답변

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

당신은의 selectedItem에게 콤보 상자의 selectedIndex의 또는 SelectedValue를 시도 할 수 있습니다. MVVM 방식에서는 SelectedIndex와 ViewModel 속성 중 하나 사이에 양방향 바인딩을 가질 수 있습니다.

관련 문제