WPF מטפל ארוע עבור Template
-
עד כמה שהבנתי, ואני מקווה שאני טועה, שכל הTemplate זה לא משהו שקיים בזכרון כמו משתנה מוצהר עם NEW, אלא זה משהו ריק כמו איזה טיפוס כל שהו, ולכן כדי לחבר לזה פקודה צריך לעשות שמיניות באויר עם ICommand, למשל אם אני רוצה להכניס לחצן לתוך פקד של בורר תאריכים כדי שהפקד יעבור ל'היום':
[code2=vb.net:2enqd55o]Imports System.Windows.Input
Imports System.Windows.ControlsPublic NotInheritable Class CalendarCommands
Private Sub New()
End Sub
Private Shared ReadOnly _selectTodayCommand As New SelectTodayCommand()Public Shared ReadOnly Property SelectToday() As ICommand Get Return _selectTodayCommand End Get End Property Private NotInheritable Class SelectTodayCommand Implements ICommand Public Custom Event CanExecuteChanged As EventHandler Implements ICommand.CanExecuteChanged AddHandler(ByVal value As EventHandler) 'CommandManager.AddCanExecuteHandler(value) End AddHandler RemoveHandler(ByVal value As EventHandler) 'CommandManager.RequerySuggested(value) End RemoveHandler RaiseEvent(ByVal sender As Object, ByVal e As EventArgs) End RaiseEvent End Event Public Function CanExecute(parameter As Object) _ As Boolean Implements ICommand.CanExecute Return TypeOf parameter Is Calendar End Function Public Sub Execute(parameter As Object) Implements ICommand.Execute Dim calendar = TryCast(parameter, Calendar) If calendar IsNot Nothing Then Dim today = DateTime.Today calendar.SelectedDate = today calendar.DisplayDate = today 'מה להוסיף כאן כדי שבורר התאריכים יסגר???? End If End Sub End Class
End Class[/code2:2enqd55o]
<Style x:Key="DefaultCalendar" TargetType="Calendar" > <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Calendar}"> <StackPanel HorizontalAlignment="Center" Name="PART_Root"> <CalendarItem Background="{TemplateBinding Control.Background}" BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="{TemplateBinding Control.BorderThickness}" Name="PART_CalendarItem" Style="{TemplateBinding Calendar.CalendarItemStyle}" /> <Button Content="Today" Command="{x:Static Commands:CalendarCommands.SelectToday}" CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"/> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style>
כמה זה יכל להיות פשוט אם הלחצן שבתוך ההTemplate היה משהו קיים שאפשר להתיחס אליו בקוד ולכתוב לו פונקציה מטפלת.
אולי מישהו יחכים אותנו בכל הנושא הזה?פורסם במקור בפורום CODE613 ב30/10/2013 18:37 (+02:00)
-
בגלל הבעיות באתר קשה לי לקרוא את הקוד.
טמפלט זה "הוראות יצירה" לתוכן כל שהוא, וכל פעם בו צריכים אותו יוצרים לפיו את מכלול "ההוראות".
אפשר להצמיד אירוע פשוט לטמפלט. ממש כמו לכל אלמנט רגיל.ICommand שימושי רק:
א. הפעלת פונקציות שמגיעות עם האובייקט אותו מטמפלטים. לדוגמא פקד שקורא מסמכי PDF, אז כשעושים לו טמפלט מחדש ורוצים שכפתור יפתח PDF ולא אנו כתבנו את השגרה לזה, אז אנו בודקים בהוראות היצרן של הפקד איזה קומנד זה ופשוט מחברים אותו לכפתור ע"י קומנד ביינדינג.
ב. מתי שאנו עצמנו רוצים לכתוב "ברמה", מה שנקרא MVVM, שאין ללוגיקה (הקוד המעשי) שום תלות בתצוגה (האובייקטים והקוד החזותיים). אז נניח כתבנו לוגיקה לפתיחת קובץ, ואנחנו רוצים לפנות אליה מהתצוגה, אז מתאים להשתמש בקומנד (אני לא חתום על הנוחות הזאת).פורסם במקור בפורום CODE613 ב11/11/2013 17:20 (+02:00)
-
לא, אתמול לא הבנתי לגמרי מה שרצית לעשות.
כעת שהבנתי, אז המילים "מה להוסיף כאן כדי שבורר התאריכים יסגר" שכתבת שייכים לDataPicker ולא לCalendar.אפשר לעשות סתם אירוע לכל אלמנט בטמפלט ממש כמו כל אירוע של כפתור:
קוד VBPrivate Sub Button_Click(sender As Object, e As RoutedEventArgs) Dim Calendar As Calendar = CType(sender, Button).TemplatedParent Dim today = DateTime.Today Calendar.SelectedDate = today Calendar.DisplayDate = today End Sub
קוד XAML הכל כמו שהראית רק תחליף את הכפתור:
<Button Content="Today" Click="Button_Click" />
פורסם במקור בפורום CODE613 ב12/11/2013 15:01 (+02:00)
-
עדיין בלחיצה על הכפתור בורר התאריכים לא נסגר.
דבר נוסף אני בעצם רוצה שאני אשתמש בסטול הזה של בורר תאריכים בדטה-גריד שיש בו עמודה של תאריך וכמו באקסס שכאשר שדה של תאריך בפוקוס יש למשתמש אפשרות ללחוץ על סמל של לוח שנה ואז הלוח שנה נפתח הוא לוחץ על 'היום' ולוח השנה נסגר, דבר כל כך פשוט לכאורא וכל כך קשה לעשות אותו בדוט-נט....
משהו בצירוף זה:
<DataGridTemplateColumn Header="Pick a Date"> <DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding myDate}" /> </DataTemplate> </DataGridTemplateColumn.CellTemplate> <DataGridTemplateColumn.CellEditingTemplate> <DataTemplate> <!--שהבורר יהיה עם לחצן 'היום'--> <DatePicker SelectedDate="{Binding myDate}" /> </DataTemplate> </DataGridTemplateColumn.CellEditingTemplate> </DataGridTemplateColumn>
פורסם במקור בפורום CODE613 ב12/11/2013 15:27 (+02:00)
-
עדיין בלחיצה על הכפתור בורר התאריכים לא נסגר.
אתה נורא מרגיז!
בשאלתך היו שאלות בצורה לא מסודרת.
עד שאני מבין ועונה לך על שאלה אחת, אתה "פורך" את התשובה בזה ששאלה אחרת שנרמזה קלות (הערה בקוד!) בשאלתך לא נענתה.
מה הכוונה "עדיין"? חשבת שתוך שעתיים בשמש זה יסתדר?!
סליחה על החריפות.הנה קוד מלא לסגירת הבורר:
Dim Calendar As Calendar = CType(sender, Button).TemplatedParent Dim today = DateTime.Today Calendar.SelectedDate = today Calendar.DisplayDate = today Dim popup = TryCast(Calendar.Parent, Primitives.Popup) If Not IsNothing(popup) Then popup.IsOpen = False
דבר נוסף אני בעצם רוצה שאני אשתמש בסטול הזה של בורר תאריכים בדטה-גריד שיש בו עמודה של תאריך וכמו באקסס שכאשר שדה של תאריך בפוקוס יש למשתמש אפשרות ללחוץ על סמל של לוח שנה ואז הלוח שנה נפתח הוא לוחץ על 'היום' ולוח השנה נסגר, דבר כל כך פשוט לכאורא וכל כך קשה לעשות אותו בדוט-נט....
למה זה דבר נוסף?
פורסם במקור בפורום CODE613 ב12/11/2013 18:51 (+02:00)
-
אני מאוד מתנצל על אי ההבנה שקרתה פה
בכל מקרה עזרת לי מאוד!
- אפשר לוותר על כל הקוד VB שהבאתי למעלה בשביל הקומנט ולהסתפק בכמה שורות של קוד שיציגו ויסגרו את הלוח הקופץ.
- הבנתי שאכן טמפלט וסטול הם 'רק' תבניות של על פיהן יווצרו דברים קיימים.
- יישר כח גדול !
פורסם במקור בפורום CODE613 ב12/11/2013 19:35 (+02:00)