יש פה כמה טעויות.
דבר ראשון, ItemContainerTemplate איננו מאפיין של ComboBox, מה שCodeDOM הזכיר זה ItemContainerStyle.
דבר שני, גם אם הוא היה מאפיין היית צריך להציב בו ככה ComboBox.PropertyName ולא סתם איבר בתוך הקומבו (שזה הופך לContent).
דבר שלישי, הבינדינג של הטקסט בלוק צריך לשאוב מידע מההקשר שלו ולא משורש הנתונים (כי בכל שורה אתה רוצה שיציג את השורה הזו, וזה הנעשה ע"י שהבינדינג לא מכיל Source ואז הוא פונה לDataContext שזה רמת השורה בComboBox).
במקרים פשוטים אני מעדיף DataTemplate (הוא "מציע" איך אמור להיראות פריט, ומי שמיישם את זה הטמפלט של ComboBoxItem שעוטף למעשה כל פריט) קח דוגמה (תדביק בחלון/פרויקט אחר כדי שתוכל לשחק ולראות תוצאות חיות):
<ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" Width="150"> <ComboBox.Items> <!--בתור נתונים תקעתי סתם אלמנטי זאמל כי בשבילם לא צריך שום ניימספיס--> <Button /> <Button /> <Button /> </ComboBox.Items> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock> <Run Text="{Binding Width}" Foreground="Red" /> <Run Text="{Binding Height}" /> </TextBlock> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox>הנה תמונה:
combo1.png
שים לב, שסביב לרקע שנקבע לAzure יש רקע לבן. זהו בעצם בTempalte ברירת המחדל של הComboBoxItem שיש לו עיצוב משלו ובו משולב העיצוב אותו מציעים לו בDataTemplate כאלמנט פנימי.
לעומת זאת, ע"י ItemContainerStyle אתה יכול לשנות את הטמפלט, ואז אתה לא מציע אלא אתה המבצע בעצמך:
<ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" Width="150"> <ComboBox.Items> <!--בתור נתונים תקעתי סתם אלמנטי זאמל כי בשבילם לא צריך שום ניימספיס--> <Button /> <Button /> <Button /> </ComboBox.Items> <ComboBox.ItemContainerStyle> <Style TargetType="ComboBoxItem"> <Setter Property="Template" > <Setter.Value> <ControlTemplate> <TextBlock Background="Aqua"> <Run Text="{Binding Width}" Foreground="Red" /> <Run Text="{Binding Height}" /> </TextBlock> </ControlTemplate> </Setter.Value> </Setter> </Style> </ComboBox.ItemContainerStyle> </ComboBox>תוצאה:
combo2.png
(אם אתה רוצה לעצב רק את המכיל לכמה ComboBox ולהשיאר "פתוח" את העיצוב ברמת הפריט, תוכל לשים את הContentPresetor שהוא שומר מקום לפריט התוכן. כך זה נראה בסטייל המקורי של הItemContainerStyle, תוכל לראות זאת ע"י Edit As Copy של הסטייל הזה).
בקשר לאיך ללמוד XAML. זה אכן מתסכל. יש ספר בסיסי שנחשב מס' 1 בWPF, שמו WPF Unleashed, אותו קניתי ואכן הוא קידם אותי המון.
(PDF פיראטי http://bit.ly/1I5Qa24).
אבל מקרים כמו הקומבו הזה הם לא סיבה לדאגה, כי יש הרבה מאמרים על זה באינטרנט מעולים. רק שבמקום לחפש על ComboBox חפש על ListBox שהיא הItemsControl הכי נפוצה. העקרונות הם אותו דבר בכל יורשי הItemsControl. הנה דוגמאות:
http://www.codeproject.com/Articles/18561/Custom-ListBox-Layout-in-WPF
http://blogs.msdn.com/b/wpfsdk/archive/2007/08/31/specifying-the-selection-color-content-alignment-and-background-color-for-items-in-a-listbox.aspx
פורסם במקור בפורום CODE613 ב20/07/2015 12:32 (+03:00)