2012-03-13 59 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中,對於以編程方式創建的項目,您不需要匿名方法。這是「對象發送者」參數的優點,您不需要本地引用。 – 2012-03-13 20:35:08

+0

我知道如何在WPF中創建匿名方法,我所說的是它不適用於DatePicker。必須有其他方式來做到這一點。 – 2012-03-13 20:46:35

+0

@MattGrogan您是在C#代碼中生成DatePicker,還是由您的XAML模板生成? – Seekeer 2012-03-14 08:48:21

回答

3

你是指使用這種匿名方法的事件處理程序嗎?

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

這正是我需要的。萬分感謝。我從來沒有找到這種語法。有時候,微軟因爲缺乏有意義的文檔而讓我氣餒。 – 2012-03-14 13:29:42

+0

是的,它可能很差。搜索'匿名方法'你應該找到大量的例子。 – Phil 2012-03-14 13:30:58