לא מבין את השגיאה אבל הקוד השני שלך אמור לעבוד.
לא רואה סיבה שלא. בדוק היטב את השמות ובמיוחד את הSelectedValuePath.
פורסם במקור בפורום CODE613 ב15/07/2015 15:27 (+03:00)
לא מבין את השגיאה אבל הקוד השני שלך אמור לעבוד.
לא רואה סיבה שלא. בדוק היטב את השמות ובמיוחד את הSelectedValuePath.
פורסם במקור בפורום CODE613 ב15/07/2015 15:27 (+03:00)
שתי הדרכים טובות, אם כי שלך הנכונה במקרים פשוטים.
בעיקרון בדוגמתך יש טעות פשוטה: המאפיין SelectedValueBinding לא מקבל סטרינג אלא בינדינג ככה:
SelectedValueBinding="{Binding Donor}"
וחוץ מזה זה אמור לעבוד.
שים לב שכל המאפיינים כתובים מדוייק (רגיש לרישיות!).
פורסם במקור בפורום CODE613 ב14/07/2015 22:03 (+03:00)
איך אפשר להכניס תיבה משולבת בתוך הדטהגריד שמחזיקה גם את המזהה וגם את הטקסט מהטבלה השניה?
DataGridComboBoxColumn.
צריך להכיר את המאפיינים:
ItemsSource צריך להכיל את הטבלה השניה (בעלת הארבעה ערכים).
נניח שיש לה עמודת ID ועמודה Description.
DisplayMemberPath שם השדה/עמודה בטבלה השניה אותו אתה רוצה שיוצג בתצוגה, היינו Description.
SelectedValuePath העמודה שתייצג את הSelectedValue. במקרה שלנו UD. כלומר שיפנו למאפיין SelectedValue וישאלו ממנו את ערכו זה יחזיר את הערך מתוך שם העמודה המצויין, וכן להפך: כשיקבעו לSelectedValue ערך, השורה שתיבחר תהיה זו שבעמודה המצויינת הערך מתאים.
אחרי כן עושים למאפיין SelectedValue בינדינג לעמודה בטבלה הנוכחית שמכילה את הID הנכון במין הארבעה.
סיבוך קטן...
פורסם במקור בפורום CODE613 ב09/07/2015 18:57 (+03:00)
דוד ל.ט. סליחה על הטרחה לשווא
שום לשווא. כיף כל פעם.
ואת המרווח כנראה עושים עם פסיק, נכון?
כן. מה שאחרי הנקודתיים זה כמו מה שכותבים בסוגריים של הToString, שזה פורמט (מטבע, תאריך, מותאם אישית) שם אם תכתוב סתם מספר זה פשוט מחליף את הערך במפר הזה.
פורסם במקור בפורום CODE613 ב06/07/2015 15:04 (+03:00)
אתה צודק ואני יודע זאת
לכן כתבתי כך:
אם ככה היה כתוב לך בקוד מלכתחילה ניסוח שאלתך מעורפל, מנין לנו לדעת שיש שתי ID??
ובכל אופן התעלומה ממש גדולה אם ככה. כי Id וid זה שתי שמות לכל דבר בC# ולא צריך שום this להבחנה ביניהם (מלבד הבחנה של קריאות). ולא התעצלתי והעתקתי את הקוד שלך ואצלי עובד פרפקט. מה הפשט?
פורסם במקור בפורום CODE613 ב06/07/2015 14:16 (+03:00)
הבעיה שלי היא שהמשתנה ID הוא סטטי (כדי שלכל תורם יהיה מס' סידורי אחר)
משתנה סטטי (ולמעשה אותו הדבר כל חבר סטטי כמו מאפיין מתודה וכו'), זה אומר שכל המופעים חולקים את אותו המשתנה! הוא לא אישי ופרטי לכל מופע אלא הוא משותף לכולם.
בעוד שמשתנה רגיל א. קיים רק אחרי שיוצרים מופע, ב. כל מופע יוצר אחד כמוהו נפרד, במשתנה סטטי המשתנה קיים ונגיש ללא יצירת מופע, ומאידך יצירת מופע לא משכפלת אותו ולמעשה הוא משתנה "גלובלי" שנגיש מכל מקום (פר אפליקציה, ובהתאם למציין הגישה שלו. אם זה פרטי אז רק מתוך המחלקה אבל לא משנה מאיזה מופע ולאו דוקא ממופע כמו במקרה של מתודה סטטית ואופרטורים).
כיון שID אמור לייצג מופע ולא לייצג את המחלקה ממנו המופע נוצר, אי אפשר שהוא יהיה סטטי, ובעצם מה שקורה כעת הוא שכשאתה מציב בID את המספר הבא - כל המופעים יחזירו את אותו המספר (בכלל בC# א"א לכתוב שם של מופע נקודה חבר סטטי אלא שם מחלקה נקודה חבר סטטי, ולכן this.ID אמור להוציא לך שגיאת זמן קמפול).
זה נכון שבשביל לעקוב אחרי מופעים אחרים של אותו אובייקט זה נוח להשתמש באוסף/משתנה סטטי. אתה יכול לכתוב משתנה בשם CurrentNumber שיהיה סטטי (ויקבל בCounstactor ++ כל פעם) שיכיל את המספר להשמה בID (שלא יהיה סטטי!) הבא. אתה גם יכול לעשות List<> סטטית שתכיל את כל המופעים, ואז תוכל לדעת עוד פרטים על כל המופעים שנוצרו ואף לגשת אליהם מכל מופע ומופע.
הנה דוגמה:
class ClassWithAutoNumber
{
public ClassWithAutoNumber()
{
ID = currNumber++;
}
private static int currNumber; // static. its one variable shared betwwen all instances
public int ID { get; set; } //not static!!! its individual created for each instance
}
פורסם במקור בפורום CODE613 ב06/07/2015 12:30 (+03:00)
תמחק את שורה 4.
אתה קורא לפונקציה ShowDialog() גם בתנאי שאח"כ.
פורסם במקור בפורום CODE613 ב05/07/2015 20:37 (+03:00)
מעניין מאוד! תודה אברהם.
חיפשתי מקורות ומצאתי (http://stackoverflow.com/a/267904/1271037).
הBinarySerialization שונה מאוד מהXML בנקודה זו: הוא ממש מצלם את מצב האובייקט (המשתנים) ובכלל לא ניגש דרך הset של המאפיינים, ואף יצירת האובייקט נעשית בדרך האקרית ללא הפעלת הCounstactor.
פורסם במקור בפורום CODE613 ב06/07/2015 16:32 (+03:00)
מאוד מענייין מה שאתה כותב. השגיאה הזאת קורה כשהערך גדול מ31? או אפי' פחות? ואיך היה הקוד קודם? נשמע ממש משונה ההבדל בין הבינארי לXML בנושא הזה.
פורסם במקור בפורום CODE613 ב06/07/2015 14:08 (+03:00)
תראה את הקוד של הסריאליזציה.
פורסם במקור בפורום CODE613 ב06/07/2015 11:02 (+03:00)
בעת בדיקת דברי אברהם בקשר להבדל בין הXML לבינארי לגבי השגיאה בset של property והעידר הצורך בבנאי ללא פרמטרים בבינארי, ההבדל התחדד לי.
ראיתי את זה שזה מאוד ספציפי לשאלה: http://stackoverflow.com/a/4743878/1271037
ההבדל הנוסף המשמעותי נמצא בתשובה לשאלה האחרת של אברהם, יעויין: http://code.613m.org/viewtopic.php?f=1&t=808&p=4924#p4924
פורסם במקור בפורום CODE613 ב06/07/2015 16:33 (+03:00)
כיום אפשר.
פשוט תתקין Visual Studio ותתחיל.
תראה פה תיעוד רשמי: https://msdn.microsoft.com/en-us/library/dn771552.aspx#NET.
אבל אני לא אוכל ללוותך בעניין מהעדר ידע וק"ו נסיון.
פורסם במקור בפורום CODE613 ב03/07/2015 10:14 (+03:00)
מאוד משונה.
אתה מריץ את התוכנה בפני עצמה או דרך הStart Debug של VS?
בקשר לShowDialog למופע כבר קיים. כנראה שבמהלך הקוד של החלון הנפתח קראת למתודה Close. מתודה זו מחסלת בעצם משאבים שאחראים לתצוגתו של החלון וממילא א"א אח"כ כבר להשתמש בו. ואכן מקובל לעשות new בכה"ג.
פורסם במקור בפורום CODE613 ב02/07/2015 10:18 (+03:00)
אברהם בלתי אפשרי לענות ככה על מבול שאלות. אני מבקש: כל שאלה אשכול. מצידי פתח מאה ביום - רק שאלות שמממש תלויות זו בזו באותו הודעה.
א. הצבה בDataContext נותנת שגיאה:
תראה את הקוד שעשית, מן הסתם שכחת new.
ב. אין ברשימה אוטומטית DataCintext כי אם DataContextProperty.
אתה כנראה כותב שם חלון ולא מופע. אם תכתוב this. או ללא שם בכלל אז תראה DataContext ברשימה.
ג. העברת מידע בין חלון לחלון. יש כמה וכמה דרכים.
ד. באיזה פקד נוח להשתמש.
הפקד GridView כולל כבר עריכה והוספת חדשים. מצד שני הוא מרוכב לעיצוב מותאם וללוגיקה. הוא עשיר בתכונות וממילא כבד לשימוש.
ListBox זה פקד שאני הכי משתמש בו בWPF.
לא הרחבתי באף תשובה כי זה בלגן. אם משהו לא מובן תתמקד בו ותשאל.
פורסם במקור בפורום CODE613 ב30/06/2015 13:34 (+03:00)
אם הגדרת בresources סטייל של עיצוב ונתת לו שם, מדוע אח"כ כתבת: Style="{StaticResource captions} ולא מספיק לכתוב style=caption?
כי המילה caption לא מתפרשת בשום דרך כסטייל, אלא משמשת כביטוי שהריסורס בשם זה ישמש כסטייל. אז ביטיים בXAML כותבים בתוך סוגריים כאלו, והסטטיק ריסורס מציין איזה סוג ביטוי כי יש הרבה סוגים.
פורסם במקור בפורום CODE613 ב05/07/2015 11:32 (+03:00)
מחוסר זמן רק נתתי דוגמה ולא כיסיתי את בעיות הפריסה, ת הפקדים המיוחדים (הרדיו והקומבו) ואת כפתורי האישו והביטול למטה, מקוה להרחיב פעם הבאה.
בהצלחה!
אני ממש שמח שאתה נכנס בכל הכח לכל התחומים הללו. אני בטוח שלא תתחרט.
פורסם במקור בפורום CODE613 ב03/07/2015 12:34 (+03:00)
טוב. אז מצד אחד אתה מתחיל, ולWPF יש עקומת לימוד רצינית: אני כבר שלוש שנים מתעסק כמעט רק בה,ויש לי פערים רציניים.
אז קשה לבוא עם פרקטיקות בבת אחת.
קודם אנסה לזרום עם הדוגמה שלך ולשפר מעט:
<Grid FlowDirection="RightToLeft" Margin="8">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="0"/> <!-- מיותר -->
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition />
<ColumnDefinition Width="Auto" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Grid.ColumnSpan="4" Content="הוסף תורם חדש" HorizontalAlignment="Center" Margin="0,22,0,5" VerticalAlignment="Center" HorizontalContentAlignment="Center" FontWeight="Bold" FontSize="14"/>
<Label Content="מס' סידורי" Grid.Column="2" Grid.Row="2" />
<Label x:Name="idNumber" Grid.Column="3" Grid.Row="2" FontWeight="Bold" FontSize="14"/>
<Label Content="שם פרטי" Grid.Column="2" Grid.Row="3" />
<Label Content="שם משפחה" Grid.Column="2" Grid.Row="4" />
<TextBox x:Name="firstName" Grid.Column="3" Grid.Row="3" />
<TextBox x:Name="lastName" Grid.Column="3" Grid.Row="4" />
<Label Content="מספר טלפון" Grid.Column="2" Grid.Row="5" />
<Label Grid.Column="2" Grid.Row="6" Content="כתובת" />
<TextBox x:Name="telefon" Grid.Row="5" Grid.Column="3" />
<TextBox x:Name="adress" Grid.Row="6" Grid.Column="3" />
<Label Content="מייל" Grid.Column="2" Grid.Row="7" />
<TextBox x:Name="eMail" Grid.Column="3" Grid.Row="7" Text="Email:"/>
<Label Grid.Row="2" Content="סכום התרומה" MinWidth="50" />
<TextBox Grid.Column="1" Grid.Row="2" x:Name="sum" />
<RadioButton x:Name="frequenci" Grid.Row="3" Content="תרומה חד פעמית" IsChecked="True"/>
<RadioButton x:Name="monthly" Grid.Row="4" Content="תרומה חודשית" />
<Label Content="אופן התשלום" Grid.Row="5" />
<ComboBox Grid.Row="5" Grid.Column="1" IsEnabled="{Binding ElementName=monthly, Path=IsChecked}">
<ComboBoxItem x:Name="creditCard" Content="כרטיס אשראי" />
<ComboBoxItem x:Name="directDebit" Content="הוראת קבע"/>
</ComboBox>
<Label Content="תאריך חיוב" Grid.Row="6" />
<TextBox x:Name="datePayBox" Grid.Row="6" Grid.Column="1" IsEnabled="{Binding ElementName=monthly, Path=IsChecked}"/>
<Grid Grid.Row="8" Grid.ColumnSpan="4" VerticalAlignment="Bottom" MinHeight="90">
<Button x:Name="addButton" Content="הוסף תורם" Click="addButton_Click" HorizontalAlignment="Left" Margin="25" Width="125" Padding="8"/>
<Button Content="חזור למסך הראשי" Click="BackClick" HorizontalAlignment="Right" Margin="25" Width="125" Padding="8"/>
</Grid>
</Grid>
בשביל ליצור שוליים לתיבות ולטקסט השתמשת בעמודות, ואני לא שמתי בכלל. הגישה שלי זה להגדיר margin לכולם באופן גורף ע" סטייל. אפשר גם להחיל את הסטייל דוקא על עמודה מסויימת של גריד (http://stackoverflow.com/a/853082/1271037). אבל אם כבר מה אני הייתי עושה, לא הייתי עובד עם שורות של גריד.
כי מאוד מצוי שאתה רוצה לשנות (להוסיף עמודה או שורה באמצע), ואז צריך לעבוד ידנית.
תראה דוגמה איך אני הייתי עושה עד לא מזמן (את ההגדרה FlowDirection תשמור לאלמנט השורש (window) זה הגדרה נורשת ולא צריך להגדירה שוב ושוב בצאצאים):
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="21.333" FontWeight="Bold">כותרת</TextBlock>
<WrapPanel Grid.Row="1" Orientation="Vertical" Margin="10,0" Grid.IsSharedSizeScope="True">
<WrapPanel.Resources>
<Style TargetType="TextBlock" x:Key="captions">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Foreground" Value="Indigo" />
<Setter Property="Margin" Value="0,0,5,0" />
</Style>
<Style TargetType="TextBox" >
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="120" />
</Style>
<Style TargetType="Grid">
<Setter Property="Height" Value="25" />
</Style>
</WrapPanel.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="cols"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource captions}" >שם פרטי</TextBlock>
<TextBox Grid.Column="1">שם פרטי</TextBox>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="cols"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource captions}" >שם פרטי</TextBlock>
<TextBox Grid.Column="1">שם פרטי</TextBox>
</Grid>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="cols"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Style="{StaticResource captions}" >שם פרטי</TextBlock>
<TextBox Grid.Column="1">שם פרטי</TextBox>
</Grid>
</WrapPanel>
</Grid>
תנסה להקטין את הטופס בשביל לראות את הגלישה לטורים (אולי אתה לא רוה זאת, אבל מצד שני לא נתת הגדרה מה יקרה כשהטופס יגדל/יקטן, וכמובן גם אני לא כיסיתי כל אפשרות).
אבל קל לראות שיש מסורבלות רבה בקוד הזה.
אחרי הרבה נסיונות מצאתי פתאום פקד פשוט בWPF ששמו HeaderedContentControl, ועיצוב שלו פשוט מאפשר לי לרכב על פקד מותאם אישית לכותרת ופקד. הנה איך שאני עושה היום:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="80"/>
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="21.333" FontWeight="Bold">כותרת</TextBlock>
<WrapPanel Grid.Row="1" Orientation="Vertical" Margin="10,0" Grid.IsSharedSizeScope="True">
<WrapPanel.Resources>
<Style TargetType="HeaderedContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="HeaderedContentControl">
<Grid Margin="5,2">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="cols"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock Text="{TemplateBinding Header}" Foreground="Indigo" Margin="10,0"/>
<ContentPresenter Grid.Column="1"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TextBox" >
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="Width" Value="120" />
</Style>
</WrapPanel.Resources>
<HeaderedContentControl Header="מס' תורם" Content="12569" />
<HeaderedContentControl Header="שם פרטי" >
<TextBox />
</HeaderedContentControl>
<HeaderedContentControl Header="שם משפחה" >
<TextBox />
</HeaderedContentControl>
<HeaderedContentControl Header="טלפון" >
<TextBox />
</HeaderedContentControl>
</WrapPanel>
</Grid>
הנה לינקים לעימוד נכון בWPF:
http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/layout-techniques-for-windows-forms-developers.aspx
http://www.codeproject.com/Articles/203946/WPF-Layout-by-Content
אבל שוב, אני נחשב מתחיל, וWPF לא בנוי טוב למתחילים :). תראה למשל דוגמה מהאינטרנט שבנויה חזק ו"גנרי":
https://karlshifflett.wordpress.com/2008/10/23/wpf-silverlight-lob-form-layout-searching-for-a-better-solution/
פורסם במקור בפורום CODE613 ב03/07/2015 12:28 (+03:00)
אגב אשמח לעצב לך אם יש לך זמן לצייר מה שאתה מעוניין, ולהעלות את התמונה לפה.
פורסם במקור בפורום CODE613 ב02/07/2015 12:29 (+03:00)
כמעט כל חלון בעולם זה כמו שאתר הולך לעשות.
וכל הפקדים שהזכרת רלוונטיים. אפשר ליישם את זה במאה צורות.
והאם זו הדרך עם grid? זו דרך אחת מצויינת.
האם הכתב גדל? לא. אבל אם רוצים זה אפשרי.
פורסם במקור בפורום CODE613 ב02/07/2015 12:26 (+03:00)
העצה היא ללמוד

בWPF יש מחלקה ששמה Panel. היא ורק היא מספקת את היכולת להכיל יותר מאלמנט אחד, ולסדר אותם.
המחלקה הזו אבסטרקטית - היא אפשר להשתמש בה ישירות ללא ירושה. המחלקות שיורשות ממנה הם:
Canavas
Grid
StackPanel
WrapPanel
DockPanel
יש עוד כמה אבל אלו העיקריים.
הפאנלים הללו יכולים להכיל כמה אלמנטיo שרוצים, כצורת הסידור שלהם היא באחריות הפאנל. לכל אחד מהם יש צורה אחרת האופיינית לו. בשביל לתת הוראות סדר ברמת אלמנט ולא ברמת הפאנל, יש לכל אלמנט את מאפייני הסידור הבאים:
כל פאנל יכול לכבד את המאפיינים הללו אך יכול להתעלם מהוראות שלא רלוונטיות לאופי הסידור שלו. למשל, StackPanel אנוכי, תמיד מכווץ את הפקדים לפי תוכנם אפי' אם הHorizontalAlignment שלהם מוגד לStretc - מתיחה לגודל מקסימלי. אתה יכול ליצור גם panel משלך ושם תהיה דיקטטור בקטע הזה :).
אני יודע שלא עניתי לך כלום, אך מאידך השאלה המעורפלת זעקה לסדר ולא לתשובה 
פורסם במקור בפורום CODE613 ב30/06/2015 14:01 (+03:00)