2010-12-01 11 views
5

बाउंटी टेम्पलेट नियंत्रण के साथ घटनाओं को तारों के संबंध में किसी भी ठोस ट्यूटोरियल/सीखने के संसाधनों के लिए पुरस्कृत किया गया।चांदी की रोशनी में टेम्पलेट नियंत्रण में घटनाओं को कैसे जोड़ा जाए?

<Style TargetType="local:DatePicker"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="local:DatePicker"> 
       <Border Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" x:Name="myDatePickerContentArea"> 
        <StackPanel Orientation="Vertical"> 
         <Button x:Name="myTestButton" Content="Test button" /> 
         <telerik:RadDatePicker Style="{StaticResource VisitsReportTextBoxStyle}" Foreground="#FFFFFF" x:Name="startDate" DateTimeWatermarkContent="Start Date"/> 
         <telerik:RadDatePicker Style="{StaticResource VisitsReportTextBoxStyle}" x:Name="endDate" DateTimeWatermarkContent="End Date"/> 
        </StackPanel> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

इस टेम्पलेट के लिए सी # है:

public class DatePicker : Control 
{ 

    public static readonly DependencyProperty StartDateSelectedDateProperty = DependencyProperty.Register("StartDateSelectedDateProperty", typeof(DateTime), typeof(DatePicker), null); 
    public DateTime? StartDateSelectedDate { get; set; } 


    public DatePicker() 
    { 
     this.DefaultStyleKey = typeof(DatePicker);    

    } 



    public override void OnApplyTemplate() 
    { 
     RadDatePicker StartDate = this.GetTemplateChild("startDate") as RadDatePicker; 
     StartDate.SelectionChanged += new Telerik.Windows.Controls.SelectionChangedEventHandler(StartDate_SelectionChanged); 
     StartDate.SelectedDate = new DateTime(2010, 01, 01);    
     base.OnApplyTemplate();   
    } 

    void StartDate_SelectionChanged(object sender, Telerik.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     RadDatePicker temp = (RadDatePicker)sender; 
     StartDateSelectedDate = temp.SelectedDate; 
    } 


} 

मेरे SelectionChanged ईवेंट सक्रिय नहीं है और मुझे यकीन है कि क्यों नहीं कर रहा हूँ

मैं इस तरह एक नियंत्रण टेम्पलेट है। कोई विचार?

+1

यदि किसी को ईवेंट उदाहरणों के साथ टेम्पलेट नियंत्रण पर किसी ट्यूटोरियल या आलेखों के बारे में पता है, तो वास्तव में इसकी सराहना की जाएगी। – BentOnCoding

+1

कस्टम नियंत्रण पर जानकारी के लिए मेरी खोज में कम से कम अकेले नहीं हूं। – BentOnCoding

उत्तर

4

यहाँ नियंत्रण की तरह मुझे लगता है कि आप का निर्माण करने के (कुछ स्पष्टीकरण के लिए अंत में नोट देखें) प्रयास कर रहे हैं के साथ सबसे अच्छा अभ्यास का उपयोग करने का एक उदाहरण है: -

[TemplatePart(Name = DatePicker.ElementStartDate, Type = typeof(RadDatePicker))] 
[TemplatePart(Name = DatePicker.ElementEndDate, Type = typeof(RadDatePicker))] 
public class DatePicker : Control 
{ 
    public DatePicker() 
    { 
     this.DefaultStyleKey = typeof(DatePicker);    
    } 


    #region Template Part Names 
    private const string ElementStartDate = "startDate"; 
    private const string ElementEndDate = "endDate"; 
    #endregion 

    #region Template Parts 
    private RadDatePicker _StartDate; 

    internal RadDatePicker StartDate 
    { 
     get { return _StartDate; } 
     private set 
     { 
      if (_StartDate != null) 
      { 
       _StartDate.SelectionChanged -= StartDate_SelectionChanged; 
      } 

      _StartDate = value; 

      if (_StartDate != null) 
      { 
       _StartDate.SelectionChanged += StartDate_SelectionChanged; 
      } 
     } 
    } 

    private RadDatePicker _EndDate; 

    internal RadDatePicker EndDate 
    { 
     get { return _EndDate; } 
     private set 
     { 
      if (_EndDate!= null) 
      { 
       _EndDate.SelectionChanged -= EndDate_SelectionChanged; 
      } 

      _EndDate= value; 

      if (_EndDate!= null) 
      { 
       _EndDate.SelectionChanged += EndDate_SelectionChanged; 
      } 
     } 
    } 

    #endregion 

    public static readonly DependencyProperty StartDateSelectedDateProperty = 
     DependencyProperty.Register(
      "StartDateSelectedDateProperty", 
      typeof(DateTime?), 
      typeof(DatePicker), 
      new PropertyMetaData(new DateTime(2010, 01, 01))); 

    public DateTime? StartDateSelectedDate 
    { 
     get { return (DateTime?)GetValue(StartDateSelectedDateProperty); } 
     set { SetValue(StartDateSelectedDateProperty)} 
    } 

    public static readonly DependencyProperty EndDateSelectedDateProperty = 
     DependencyProperty.Register(
      "EndDateSelectedDateProperty", 
      typeof(DateTime?), 
      typeof(DatePicker), 
      new PropertyMetaData(new DateTime(2010, 01, 01))); 

    public DateTime? EndDateSelectedDate 
    { 
     get { return (DateTime?)GetValue(EndDateSelectedDateProperty); } 
     set { SetValue(EndDateSelectedDateProperty)} 
    } 

    public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate();   

     StartDate = GetTemplateChild(ElementStartDate) as RadDatePicker; 
     EndDate = GetTemplateChild(ElementEndDate) as RadDatePicker; 
    } 

    void StartDate_SelectionChanged(object sender, Telerik.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     // Do stuff with StartDate here 
    } 

    void EndDate_SelectionChanged(object sender, Telerik.Windows.Controls.SelectionChangedEventArgs e) 
    { 
     // Do stuff with EndDate here 
    }  
} 
,210

टेम्पलेट Xaml दिखना चाहिए: - एक प्रमुख समस्या आपके मूल कोड था

<Style TargetType="local:DatePicker">         
    <Setter Property="Template">         
     <Setter.Value>         
      <ControlTemplate TargetType="local:DatePicker">         
       <Border Background="{TemplateBinding Background}"         
         BorderBrush="{TemplateBinding BorderBrush}"         
         BorderThickness="{TemplateBinding BorderThickness}" x:Name="myDatePickerContentArea">         
        <StackPanel Orientation="Vertical">         
         <Button x:Name="myTestButton" Content="Test button" />         
         <telerik:RadDatePicker x:Name="startDate" 
          Style="{StaticResource VisitsReportTextBoxStyle}" 
          Foreground="#FFFFFF" 
          DateTimeWatermarkContent="Start Date" 
          SelectedDate="{TemplateBinding StartDateSelectedDate}" 
         />         
         <telerik:RadDatePicker x:Name="endDate" 
          Style="{StaticResource VisitsReportTextBoxStyle}" 
          DateTimeWatermarkContent="End Date" 
          SelectedDate="{TemplateBinding EndDateSelectedDate}" 
         />         
        </StackPanel>         
       </Border>         
      </ControlTemplate>         
     </Setter.Value>         
    </Setter>         
</Style> 

कुछ स्पष्टीकरण

  • कि यह निर्भरता गुण सही ढंग से लागू नहीं किया था। ध्यान दें कि गुण अब GetValue और SetValue का उपयोग करते हैं, यह भी कि मेटा डेटा का उपयोग onapplytemplate में सेट करने के बजाय डिफ़ॉल्ट को असाइन करने के लिए किया जाता है।
  • गुणों को सही ढंग से कार्यान्वित करने के साथ टेम्पलेट बाध्यकारी काम करना चाहिए और असल में हम आपके मूल उद्देश्य के रूप में जो कुछ भी प्रतीत होता है, उतना ही किया जाता है, इसलिए मैंने ईवेंट हैंडलर में कोई वास्तविक कोड छोड़ा है।
  • कुंजी टेम्पलेट भागों के नाम रखने के लिए कोड में स्थिरांक बनाएं जिन्हें आप बातचीत करना चाहते हैं, यह नाम परिवर्तनों को कम महंगे बनाने की अनुमति देता है।
  • TemplatePart कक्षा में विशेषताओं को इंगित करने के लिए महत्वपूर्ण तत्वों को इंगित करने के लिए विशेषताएँ, उनके नाम क्या होना चाहिए और किस आधार प्रकार की अपेक्षा की जाती है। यह किसी डिज़ाइनर को मौजूदा नियंत्रण को फिर से टेम्पलेट करने की अनुमति देता है, जब तक कि घोषित टेम्पलेट पार्ट्स मौजूद न हों, नियंत्रण को सही ढंग से कार्य करना चाहिए, भले ही उसका यूआई मूल रूप से बदल दिया गया हो।
  • यदि आपको कुछ तत्वों के लिए ईवेंट हैंडलर संलग्न करने की आवश्यकता है तो तत्व के संदर्भ को पकड़ने के लिए एक फ़ील्ड बनाएं और उसके बाद इसे लपेटने के लिए एक प्रॉपर्टी बनाएं। जब आप कोड में देखते हैं तो प्रॉपर्टी सेटर को ईवेंट हैंडलर को अलग और अटैच करना चाहिए।
  • सुनिश्चित करें कि bae.OnApplyTemplate को OnApplyTemplate के ओवरराइड में बुलाया जाता है, क्योंकि आप ऊपर बनाए गए गुणों को असाइन करने के लिए इसे सीधे आगे देख सकते हैं।
  • मेरे पास RadDatePicker नहीं है इसलिए मैं परीक्षण नहीं कर सकता, मेरी एकमात्र उत्कृष्ट चिंता यह है कि DateTime? चयनित दिनांक संपत्ति के लिए सही प्रकार है। निश्चित रूप से यदि यह माइक्रोसॉफ्ट पेशकश पर एक सुधार है जो इस विशिष्ट डेटा प्रविष्टि आवश्यकता पर गेंद को छोड़ देता है।
3

मैं हो सकता है केवल अनुमान लगा समस्या यह है कि OnApplyTemplate विधि के लिए Implementers should always call the base implementation before their own implementation.
दूसरी बात यह है कि अपने कोड से ऐसा लगता है कि यह TemplateBinding (Archive) (V4) टेम्पलेट XAML में उपयोग करने के लिए बेहतर है है कि

<telerik:RadDatePicker SelectedDate={TemplateBinding StartDateSelectedDate} 
         Style="{StaticResource VisitsReportTextBoxStyle}" 
         Foreground="#FFFFFF" x:Name="startDate" 
         DateTimeWatermarkContent="Start Date"/> 
+0

इनमें से कोई भी प्रभाव नहीं पड़ा। Thnxs हालांकि = डी – BentOnCoding

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