2010-08-18 6 views
1

날짜 및 상태 값을 포함하는 클래스에 바인딩 된 확장 Calendar 컨트롤이 있습니다. 이 아이디어는 근본적으로 국경일, 주말 공휴일 및 개인적인 휴일을 구분합니다. CalendarDay의 요소에 채우기 색을 선택하기 위해 달력 컨트롤과 연결된 개체 목록과 비교하여 현재 날짜를 검사하는 Converter를 사용하여 색상을 다양하게 렌더링합니다. 이것은 모두 완벽하게 작동합니다.캘린더 컨트롤, 클릭시 하루 배경색 변경

문제는 사용자가 특정 모드로 하루를 클릭 할 때 해당 날짜를 휴일/휴일로 선택하거나 선택 취소 할 수 있다는 것입니다. PreviewMouseDown을 사용하여 선택한 데이터 컨텍스트 (datetime)로 개체를 선택하고 상태를 업데이트합니다. 이 잘 작동하지만 새로 고침 performa 일정 컨트롤을 가져올 수 없습니다.

캘린더가 내 사용자 정의 클래스에 바인딩되어 있지 않습니다. 정확하게 CalendarDay가 바인딩되는 방법이 확실하지 않지만 DateTime 값을 가리키는 데이터 컨텍스트 만있는 것으로 보입니다. 따라서 NotifyPropertyChanged가 종료되었습니다. 날짜를 클릭하고 월을 전환하면 날짜가 예상대로 강조 표시됩니다. 필요한 것은 캘린더에 다시 그리기를 지시하는 것입니다. 나는 repaints를 강요에 대한 예제를 샅샅이 살펴 봤는데, 아무것도 지금까지 일한 적이 없다.

다른 것들 중에서 UpdateLayout()을 시도했습니다. 마우스 이벤트 내에서 다시 렌더링하려고하기 때문에 이것이 문제가되는지는 알 수 없습니다. 변환기를 시작할 수 있도록 달력 컨트롤을 다시 그리는 방법에 대한 아이디어가 있습니까?

+0

좋아, 나는 이것으로 약간의 진전을 이뤘다고 생각하지만 아직 100 %는 아니다. 이 추가 할 경우 : var test = VisualTreeHelper.GetChild (VisualTreeHelper.GetParent (e.OriginalSource DependencyObject), 1) Rectangle; test.Fill = new SolidColorBrush (Colors.Red); ... 하루를 클릭 할 때 mousedown 이벤트에 CalendarDay 내의 요소 채우기를 변경할 수 있습니다. 나는 이것이 컨버터가 설정을 오버라이드하는 레이아웃을 시작하기를 희망했다. 불행히도 그것은 템플릿 색상을 오버라이드 한 것 같습니다. (그 날은 매달 빨간색입니다.) –

답변

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); 

    } 

컨버터 하루의 색상을 결정하는 것입니다 : 이 이벤트 코드입니다. 달력에서 현재 바운드 날짜를 받아들이고 현재 calendarDown 목록을 검색 할 수있는 달력 컨트롤 자체를받습니다.

바인딩을 다시 지정하면 달력 날짜에 강제로 해당 날짜가 새로 고쳐집니다.

얼마나 고통스러운 일이었습니다.