2011-02-18 14 views
10

के अंदर कैलेंडर के लिए डेटटाइम प्रकार की बाध्यकारी व्यूमोडेल संपत्ति मुझे WPF बाइंडिंग में कोई समस्या है। मैं महीनों की सूची को आइटम्स कंट्रोल में जोड़ना चाहता हूं जो प्रत्येक महीने के लिए कैलेंडर नियंत्रण दिखाता है। लेकिन प्रत्येक प्रस्तुत कैलेंडर डेटटाइम दिखाता है.अब, बाध्य दिनांक समय नहीं। क्या किसी को पता है कि ये क्यों हो रहा है?डब्ल्यूपीएफ: आइटम्स कंट्रोल

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 ViewModel:

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

मार्कस हटर द्वारा उत्तर देना चाहिए। या तुमने कोशिश की? – publicgk

उत्तर

4

यह समस्या प्रदर्शित होती है कि कैलेंडर DisplayDate प्रॉपर्टी को कैसे प्रारंभ करता है। यह वर्तमान में इस तरह यह करता है:

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

ऐसा लगता है कि भले ही DisplayDate बंधन स्थापित है से पहले प्रारंभ किया जा रहा है, यह अभी भी वापस बाध्यकारी स्रोत के रूप में अगर यह करने के बाद स्थापित किए गए थे पुश किया जाएगा। यह एक बग की संभावना है।

आप की तरह कुछ का उपयोग कर इसे हल करने के कर सकते हैं:

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

या आप बाद में बाध्यकारी स्थापित कर सकता है (अर्थात जब कैलेंडर लोड किया जाता है) एक ईवेंट हैंडलर या संलग्न व्यवहार का उपयोग कर।

1

प्रदर्शनडेट के बजाय चयनित दिनांक पर बाध्यकारी आज़माएं। वैकल्पिक रूप से, अगर आप IsTodayHighlighted = "false" सेट करते हैं तो यह बेहतर काम करता है या नहीं।

+0

आवश्यकता है कि प्रति कैलेंडरलिस्ट केवल एक चयनित दिनांक हो सकता है। IsTodayHighlighted = "झूठी" मदद नहीं करता है। –

0

मैंने कहीं पढ़ा है कि यदि आप चयनित वस्तुओं (जैसे किसी अन्य सूची बॉक्स से) के लिए एक सूची बॉक्स को बांधते हैं, तो यह केवल दूसरे चयनित बॉक्स पर चयनित पहले चयनित आइटम को दिखाता है। मुझे यकीन नहीं है कि यह यहां प्रासंगिक है, लेकिन ऐसा लगता है कि यह हो सकता है।

12

क्या यह आपकी आवश्यकताओं के अनुरूप है?

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

+1 महान जवाब। मुझे आश्चर्य है कि कैलेंडर खुद को इस तरह क्यों शुरू नहीं करता है ...मैंने अपने बालों को समझने की कोशिश की कि निम्नलिखित क्यों काम नहीं करेंगे: '<कैलेंडर चयनित दिनांक =" {बाध्यकारी जो भी} "DisplayDate =" {बाध्यकारी जो भी} "/>' –

संबंधित मुद्दे