2010-08-18 149 views
1

我有一個擴展日曆控件綁定到包含日期和狀態值的類。這個想法基本上可以區分國家假期,州假日和休息日。我使用轉換器以不同的顏色呈現這些顏色,該轉換器將當前日期與日曆控件相關聯的對象列表進行檢查,以便爲CalendarDay中的元素選擇填充顏色。這一切都完美。日曆控件,點擊更改日背景顏色

問題是,我想支持,當用戶點擊一天(在給定的模式),他們可以選擇,或取消選擇該日期作爲休息/假期。使用PreviewMouseDown我通過選擇的數據上下文(日期時間)選擇對象並更新它的狀態。這工作正常,但我無法讓日曆控件執行刷新。

日曆並未綁定到我的自定義類,我不確定CalendarDay是如何綁定的,但它似乎只有一個指向DateTime值的數據上下文。所以NotifyPropertyChanged出來了。如果我點擊一個日期並切換幾個月,那麼日期顯示如預期突出顯示,我需要的是告訴日曆重新繪製。我一直在搜索強制重繪的例子,迄今爲止還沒有任何工作。

我已經嘗試了UpdateLayout()等其他東西。我不知道這是否是一個問題,因爲我試圖從鼠標事件中重新渲染。任何想法如何重新繪製日曆控件,以便轉換器可以啓動?

+0

好吧,我想我已經取得了一些進展,但它還不是100%。如果我添加: var test = VisualTreeHelper.GetChild(VisualTreeHelper.GetParent(e.OriginalSource as DependencyObject),1)as Rectangle; test.Fill = new SolidColorBrush(Colors.Red); ...當點擊一天的時候,我可以更改CalendarDay中的元素的填充的mousedown事件。我希望這會引起轉換器覆蓋設置的佈局。不幸的是,它似乎已經覆蓋了模板的顏色。 (那一天每個月都是紅色的。) – 2010-08-18 03:54:45

回答

3

最終發現它。如果其他人一直在嘗試做類似的事情,則可以發佈繁榮。

正如在評論中提到的那樣,設置元素的填充顏色確實改變了背景顏色,但是在所有月份的當天都這樣做了。這實際上是有意義的,因爲填充通常由模板管理,並基於綁定和轉換器進行設置。

解決方法是在單擊日期時重置鼠標向下事件的綁定。 這是事件代碼:

protected override void OnPreviewMouseLeftButtonDown(System.Windows.Input.MouseButtonEventArgs e) 
    { 
     if (!(e.OriginalSource is FrameworkElement && 
      (e.OriginalSource as FrameworkElement).DataContext is DateTime)) 
     { 
      base.OnPreviewMouseLeftButtonDown(e); 
      return; 
     } 

     DateTime dateTime = (DateTime)(e.OriginalSource as FrameworkElement).DataContext; 

     var calendarDay = _calendarDays.Single(d => d.CalendarDate == dateTime); 

     if (calendarDay.IsHoliday) 
     { 
      calendarDay.CalendarKey = null; 
     } 
     else 
     { 
      calendarDay.CalendarKey = Guid.NewGuid(); 
     } 
     var holidayBackgroundRect = VisualTreeHelper.GetChild(VisualTreeHelper.GetParent(e.OriginalSource as DependencyObject), 1) as Rectangle; 
     var binding = new MultiBinding(); 
     binding.Bindings.Add(new Binding()); 
     binding.Bindings.Add(new Binding() { ElementName = "Calendar" }); 
     binding.Converter = new CalendarDayColorConverter(); 
     holidayBackgroundRect.SetBinding(Rectangle.FillProperty, binding); 
     base.OnPreviewMouseLeftButtonDown(e); 

    } 

該轉換器是什麼決定了一天的顏色。它接受日曆中的當前綁定日期,並且日曆控件可以檢索holidayDays的當前列表。

通過重新指定綁定,它強制日曆日刷新該日期。

這是多麼痛苦的一直。