משיב מוביל
איך מוסיפים עמודות לגריד מתוך ה ViewModel ללא Code Behind?

שאלה
-
יש דרך כלשהי לעשות את הוספת הטורים בVM? כדי להמנע מcode behind או לשמור את זה בMVVM?
sainity is overrated
- פוצל על-ידי Elad R Katz יום ראשון 11 מרץ 2012 09:16 שאלה נוספת
- נערך על-ידי Elad R Katz יום ראשון 11 מרץ 2012 09:29 פיצול מהשאלה המקורית
יום שישי 09 מרץ 2012 09:16
תשובות
-
הי,
התחלתי לענות תשובה, אבל מהר מאוד זה התפתח לפוסט שלם - אתה יכול לראות איך עושים זאת בפוסט הבא:
כמו כן, @אסף - התייחסתי שם גם לפתרון שאתה הצעת והסברתי למה לפי דעתי זו טעות.
http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt
- נערך על-ידי Elad R Katz יום שני 12 מרץ 2012 14:33 הוספה
- סומן כתשובה על-ידי slave of the mind יום שני 12 מרץ 2012 17:18
יום שני 12 מרץ 2012 14:29
כל התגובות
-
שלום,
לא ראיתי את השאלה המקורית, אך נדמה שיש לך 2 אפשרויות:
1. לרשת מהקונטרול, לנסות להרשם לארוע של שינוי ה- source, וכךל שנות את העמודות בהתאם. כך אתה משתמש בקוד של הקונטרול, אבל לא בקוד של ה- view.
2. ליצור AttachedProperty מסוג ICommand של שינוי ה- Source, ולהפעיל command שמוסיף את העמודות ב- vm. במקרה הזה אתה קצת תלוי קונטרול, זה פחות טוב.
אסף.
My Blog: http://benjaminet.wordpress.com
יום ראשון 11 מרץ 2012 09:25 -
DataGrid.Columns לא תומך ב DataBinding ולפיכך על פי ברירת המחדל DataGrid לא תומך בשליטה כזו מה ViewModel.
הפתרון הקלאסי למצבים מהסוג הזה הוא אחד משניים:
1. יצירת קונטרול חדש שיורש מ DataGrid והוספת מאפיין נוסף של ColumnsSource שתומך ב DataBinding, ומוסיף Column לכל איבר במערך אליו הוא קשור. כך אתה למעשה יוצר DataGrid שבנוי לMVVM יותר טוב. (יש לא מעט מקומות בהם צריך "לעזור" לקונטרולים להיות יותר MVVM-ים :) )
או:
2. יצירת Behavior שאפשר לחבר ל DataGrid שיש לו מאפיין ColumnsSource שתומך ב DataBinding ומוסיף עמודות לגריד אליו הוא מחובר.
שתי הדרכים כמעט ומקבילות - ואין ביניהן הבדל משמעותי יותר מדי. הוספת Behavior בדרך כלל אעשה במקרה ואני רוצה להוסיף יכולת "קטנה" לקונטרול קיים (אפשר להסתכל על Behaviors כמו על ExtensionMethods. דרך קלה להוסיף פונקציונאליות למחלקה מבחוץ.)
אם אתה לא יודע איך לעשות זאת תגיד ואשמח לעזור הלאה.
חשוב מאוד לציין כי הוספת קוד לקונטרול או לBehavior שונה משמעותית מהוספת קוד לCodeBehind. ע"פ MVVM מותר להוסיף קוד של View ל View, וקוד כזה אפשר לשים גם ב CodeBehind עקרונית, אבל הבעיה עם code behind זה שמתחילים בלשים בו קוד של VIEW, ומהר מאוד שמים שם בטעות קוד של לוגיקה, של ViewModel. "זליגת" הלוגיקה הנ"ל היא היא הבעיה האמיתית של שימוש ב CodeBehind ולפיכך מהווה את הסיבה להמנע מלכתוב שם קוד.
הוספת קוד של VIEW לBehaviors או ל Controls לעומת זאת, לא סובלת מהבעיה הזו, היות וקשה מאוד ללוגיקה אמיתית לזלוג לשם, ולפיכך הפרדת האחראויות (Seperation of Concerns) נשמרת בצורה מעולה.יום ראשון 11 מרץ 2012 09:29 -
אסף - אופציה מס' 2 בעייתית מאוד לפי דעתי. התלות בקונטרול שאתה מצביע עליה היא למעשה הריסת MVVM לגמרי במקרה הנ"ל. ל ViewModel אסור אף פעם לדעת על ה View שלו, ללא יוצאים מהכלל. עדיף בהרבה כבר לכתוב את זה בcode behind לגמרי.יום ראשון 11 מרץ 2012 09:31
-
מתוך שני הפתרונות נראה לי שיותר מתאים למקרה שלי פתרון של יצירת Behavior, כרגע הבעיה היא חד פעמית ולא בdataGrid הסטנדרטי.
מכוון שאני לא מכיר Behavior אשמח אם תוכל לכוון אותי לדוגמא דומה למה שדיברת או מאמר טוב בנושא כדי שאתחיל ללמוד.
תודה רבה על העזרה
sainity is overrated
יום ראשון 11 מרץ 2012 16:04 -
הי,
התחלתי לענות תשובה, אבל מהר מאוד זה התפתח לפוסט שלם - אתה יכול לראות איך עושים זאת בפוסט הבא:
כמו כן, @אסף - התייחסתי שם גם לפתרון שאתה הצעת והסברתי למה לפי דעתי זו טעות.
http://blogs.microsoft.co.il/blogs/eladkatz @ElatKt
- נערך על-ידי Elad R Katz יום שני 12 מרץ 2012 14:33 הוספה
- סומן כתשובה על-ידי slave of the mind יום שני 12 מרץ 2012 17:18
יום שני 12 מרץ 2012 14:29