2011-02-18 5 views
10

WPF 바인딩에 문제가 있습니다. 매월 Calendar 컨트롤을 보여주는 ItemsControl에 Month 목록을 바인딩하고 싶습니다. 그러나 렌더링 된 각 달력에는 바운드 DateTimes가 아니라 DateTime.Now가 표시됩니다. 왜 이런 일이 일어나는 지 아는 사람이 있습니까?WPF : DateTime 유형의 viewmodel 속성을 ItemsControl 내의 Calendar에 바인딩합니다.

MainWindow.xaml

<Window x:Class="CalendarListTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ItemsControl x:Name="calendarList"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Calendar DisplayDate="{Binding CurrentDate}" /> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

** 컬렉션이 ItemsSource **

에 할당 된 장소 :

내가 지금까지 무엇을 가지고
 private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     CalendarList list = new CalendarList(); 
     list.Add(new CalendarMonth() { CurrentDate = DateTime.Parse("1.1.1979") }); 
     list.Add(new CalendarMonth() { CurrentDate = DateTime.Parse("1.2.1979") }); 
     list.Add(new CalendarMonth() { CurrentDate = DateTime.Parse("1.3.1979") }); 

     calendarList.ItemsSource = list; 
    } 

CalendarMonth 뷰 모델 :

public class CalendarMonth 
{ 
    private DateTime _currentDate; 

    public DateTime CurrentDate 
    { 
     get { return _currentDate; } 
     set { _currentDate = value; } 
    } 

} 

그리고 컬렉션은 ItemsControl에에 바인딩 :

public class CalendarList : ObservableCollection<CalendarMonth> 
{ 
} 

을 이제 결과 :

enter image description here

왜 이런 일이 있습니까?

편집 : <Calendar DisplayDate="{Binding CurrentDate, Mode=OneWay}" />을 제공하면 바인딩이 작동합니다.

+1

Markus Hütter가 대답해야합니다. 너 해봤 어? – publicgk

답변

4

문제는 캘린더가 DisplayDate 속성을 초기화하는 방법과 관련이있는 것 같습니다. 그것은 현재이처럼 않습니다 : DisplayDate 바인딩이 설정되기 전에 초기화되는 경우에도이 후 설정 것처럼, 그것은 여전히 ​​바인딩 소스에 밀려 될 것으로 보인다

public Calendar() { 
    // ... 
    base.SetCurrentValueInternal(DisplayDateProperty, DateTime.Today); 
} 

. 이것은 대부분 버그 일 가능성이 높습니다.

당신은 같은 것을 사용하여 해결할 수 있습니다

public class MyCalendar : Calendar { 
    public MyCalendar() { 
     this.ClearValue(DisplayDateProperty); 
    } 
} 

를 또는 나중에 바인딩을 설정할 수있다 (즉, 일정이로드 될 때) 이벤트 핸들러 또는 첨부 된 동작을 사용.

1

DisplayDate 대신 SelectedDate에 바인딩을 시도하십시오. 또는 IsTodayHighlighted = "false"로 설정하면 더 잘 작동하는지 확인하십시오.

+0

CalendarList 당 하나의 SelectedDate 만있을 수 있다는 요구 사항이 있습니다. IsTodayHighlighted = "거짓"이 도움이되지 않습니다. –

0

목록 상자를 다른 목록 상자 같은 선택한 항목 집합에 바인딩하면 두 번째 목록 상자에서 선택한 첫 번째 항목 만 표시됩니다. 이것이 여기 관련이 있는지는 잘 모르겠지만 그것이 될 수있는 것처럼 보입니다.

12

귀하의 요구 사항에 맞습니까?

<Calendar SelectedDate="{Binding Path=CurrentDate}" 
      DisplayDate="{Binding Path=SelectedDate, 
           RelativeSource={RelativeSource Self}, 
           Mode=OneWay}" /> 
+0

+1 좋은 답변입니다. 나는 Calender가 왜 이런 식으로 초기화하지 않는지 궁금해.나는 왜 다음과 같이 간단하게 작동하지 않는지 이해하려고 애쓰는 내 머리카락을 찢었다.

관련 문제