2012-03-13 2 views
0

프로그래밍 방식으로 만든 WPF 폼이 있습니다. 이것은 기본적으로 2 DatePicker 개체가있는 항목 목록으로 날짜 범위를 지정합니다. 나는 대부분 모든 부분에서 일하고 있지만, 나는 SelectedDateChanged 이벤트에서 약간의 논리를 해고해야한다.DatePicker 익명 이벤트 처리기

DatePicker은 이전 양식의 선택 사항을 기반으로 동적으로 생성되므로 익명 수신기 (또는 .NET에서 호출 한 이름)를 사용해야합니다. 내가 어떻게 할 수 있는지 알지 못해서 내가 할 수 없었고 어떤 예제도 찾거나 구글을 통해 도움을주는 것처럼 보인다. 모든 팁에 미리 감사드립니다.

생성 DatePickers :

public SystemInterval(Role role) 
    { 
     this.role = role; 
     InitializeComponent(); 
     lbls = new Label[role.RoleSystems.Length]; 
     dp = new DatePicker[role.RoleSystems.Length * 2]; 
     cks = new CheckBox[role.RoleSystems.Length]; 
     ScrollViewer sv = new ScrollViewer(); 
     sv.HorizontalAlignment = System.Windows.HorizontalAlignment.Stretch; 
     sv.VerticalAlignment = System.Windows.VerticalAlignment.Top; 
     sv.Margin = new Thickness(0,50,0,40); 
     Grid g = new Grid(); 
     g.HorizontalAlignment = System.Windows.HorizontalAlignment.Left; 
     g.VerticalAlignment = System.Windows.VerticalAlignment.Top; 
     ColumnDefinition col1 = new ColumnDefinition(); 
     col1.Width = new GridLength(46); 
     ColumnDefinition col2 = new ColumnDefinition(); 
     col2.Width = GridLength.Auto; 
     ColumnDefinition col3 = new ColumnDefinition(); 
     col3.Width = new GridLength(150); 
     ColumnDefinition col4 = new ColumnDefinition(); 
     col4.Width = new GridLength(150); 
     g.ColumnDefinitions.Add(col1); 
     g.ColumnDefinitions.Add(col2); 
     g.ColumnDefinitions.Add(col3); 
     g.ColumnDefinitions.Add(col4); 
     sv.Content = g; 
     LayoutRoot.Children.Add(sv); 

     for (int r = 0; r < cks.Length; r++) 
     { 
      g.RowDefinitions.Add(new RowDefinition()); 
     } 

     g.Height = (lbls.Length * 25) + (lbls.Length * 5); 

     for (int i = 0, j = 0; i < cks.Length; i++, j+=2) 
     { 
      cks[i] = new CheckBox(); 
      cks[i].IsChecked = false; 
      cks[i].VerticalAlignment = System.Windows.VerticalAlignment.Center; 
      cks[i].HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 
      Grid.SetColumn(cks[i], 0); 
      Grid.SetRow(cks[i], i); 
      g.Children.Add(cks[i]); 

      lbls[i] = new Label(); 
      lbls[i].Height = 25; 
      lbls[i].Content = role.RoleSystems[i].SystemName; 
      lbls[i].VerticalAlignment = System.Windows.VerticalAlignment.Center; 
      lbls[i].HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 
      Grid.SetColumn(lbls[i], 1); 
      Grid.SetRow(lbls[i], i); 
      g.Children.Add(lbls[i]); 

      dp[j] = new DatePicker(); 
      dp[j].Height = 25; 
      dp[j].Width = 115; 
      dp[j].VerticalAlignment = System.Windows.VerticalAlignment.Center; 
      dp[j].HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 
      dp[j].IsEnabled = false; 
      dp[j].BlackoutDates.Add(new CalendarDateRange(new DateTime(0001, 1, 1), DateTime.Now.Subtract(TimeSpan.FromDays(1)))); 
      Grid.SetColumn(dp[j], 2); 
      Grid.SetRow(dp[j], i); 
      g.Children.Add(dp[j]); 

      dp[j + 1] = new DatePicker(); 
      dp[j + 1].Height = 25; 
      dp[j + 1].Width = 115; 
      dp[j + 1].VerticalAlignment = System.Windows.VerticalAlignment.Center; 
      dp[j + 1].HorizontalAlignment = System.Windows.HorizontalAlignment.Center; 
      dp[j + 1].IsEnabled = false; 
      dp[j + 1].BlackoutDates.Add(new CalendarDateRange(new DateTime(0001, 1, 1), DateTime.Now)); 
      Grid.SetColumn(dp[j + 1], 3); 
      Grid.SetRow(dp[j + 1], i); 
      g.Children.Add(dp[j + 1]); 

      cks[i].Click += new RoutedEventHandler(delegate(object s, RoutedEventArgs re) 
      { 
       CheckBox cb = (CheckBox)re.Source; 
       for (int r = 0; r < cks.Length; r++) 
       { 
        if (cks[r].Equals(cb)) 
        { 
         dp[r * 2].IsEnabled = true; 
         dp[r * 2 + 1].IsEnabled = true; 
        } 
       } 
      }); 
     } 

checkboxs 그러나 이것은 DatePicker.SelectedDateChanged 이벤트 작동하지 않습니다, 익명 이벤트 핸들러를 가지고있다.

+0

WPF 이벤트에 대해서는 잘 모르지만 Winforms에서는 프로그래밍 방식으로 생성 된 항목에 익명 메소드가 필요하지 않습니다. 이것이 "객체 발신자"매개 변수의 장점입니다. 로컬 참조가 필요하지 않습니다. –

+0

WPF에서 anon 메서드를 만드는 방법을 알고 있습니다. 내가 말하는 것은 DatePicker에서 작동하지 않는다는 것입니다. 그것을하기위한 다른 방법이 있어야합니다. –

+0

@MattGrogan C# 코드로 DatePicker를 생성합니까, 아니면 XAML 템플릿에서 DatePicker를 생성합니까? – Seekeer

답변

3

다음과 같은 익명 메소드를 사용하는 이벤트 처리기를 의미합니까?

var dp = new DatePicker(); 
dp.SelectedDateChanged += 
    (sender, args) => 
     { 
      var picker = (DatePicker) sender; 
      /* do stuff here */ 
     }; 
+0

정확히 내가 필요한 것. 엄청 고마워. 나는 그 구문을 결코 발견하지 못했을 것이다. Microsoft는 때때로 의미있는 문서가 부족하여 나를 화나게합니다. –

+0

예, 꽤 가난 할 수 있습니다. '익명의 방법'을 찾으려면 많은 예제를 찾아야합니다. – Phil