כן, באמת מעניין אבל העיקר שעובד.
תודה על ההשקעה במציאת הפתרון
פורסם במקור בפורום CODE613 ב15/07/2013 11:20 (+03:00)
כן, באמת מעניין אבל העיקר שעובד.
תודה על ההשקעה במציאת הפתרון
פורסם במקור בפורום CODE613 ב15/07/2013 11:20 (+03:00)
מצאתי את הפתרון! זה לא שהקומבו בגריד לא עבד אלא פשוט לא הכנסתי אותו נכון לתוך ה-dataGrid.
אני הגדרתי אותו בתוך DataGridTemplateColumn.CellTemplate במקום להגדיר אותו בתוך DataGridTemplateColumn.CellEditingTemplate ולכן הוא איפשר לפתוח את הקומבו אבל לא לבחור בו ערכים. ששיניתי את זה למיקום החדש (והוספתי ב-DataGridTemplateColumn.CellTemplate טקסט עבור ה-selectedItem של הקומבו.)
פורסם במקור בפורום CODE613 ב14/07/2013 22:14 (+03:00)
שכחתי להוסיף גם שהיוזר קונטרול מבצע את הevent של הוסף חדש - קוד זהה לכל ה-combobox. זו סיבה נוספת לכך שזה נכתב בתוך יוזר קונטרול.
פורסם במקור בפורום CODE613 ב11/07/2013 21:44 (+03:00)
אם אני שמה את ה-user control במקום אחר - ולא בתוך הגריד אז הכל עובד בסדר. רק הבעיה אם הוא מוכנס לתוך הגריד.
יש לי יוזר קונטרול MyCombobox שהוא אחראי על הבינדינג - ב-laod הוא מאתחל את הרשימה לפי הפרמטרים שנשלחים אליו ב-dependencyProperty והוא בעצם מאתחל את ה-local:EnhancedComboBox (שהוא יורש מ-combobox רגיל ומוסיף לו כפתור של הוסף חדש).
ה- local:EnhancedComboBox הוא קוד שהורדתי מהאיטנרנט:
מכיל מחלקה ו-style הוא לא יוזר קונטרול לכן יצרתי יוזר קונטרול שבעצם מכיל כזה קומבו.
לא ברור לי למה ההתנהגות שונה אם הוא מונח בתוך הגריד.
פורסם במקור בפורום CODE613 ב11/07/2013 20:28 (+03:00)
יש לי קומבו שיורש מקומבו רגיל ומוסיף לעצמו כפתור של "הוסף חדש". את הקומבו הזה שמתי בתוך userControl שהוא אחראי למלא את האיברים בקומבו בהתאם לפרמטרים שנשלחים אליו.
הקומבו עובד טוב רק הבעיה מתחילה כשאני שמה אותו בתוך datagrid בצורה הבאה:
<DataGridTemplateColumn Header="תאור" Width="Auto" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<controls:MyComboBox x:Name="DescriptionCombo" Height="20" SelectedVal="{Binding Description,Mode=TwoWay}"
ParentControl="ContactsCommunications" Sub="Description"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
(ParentControl ו-Sub הם dependencyProperties לצורך מילוי הקומבו)
בתוך ה-usercontrol שנקרא MyComboBox יש את הקומבו המיוחד שנקרא :EnhancedComboBox הקוד נראה כך:
<local:EnhancedComboBox x:Name="comboBox"
MinWidth="20" Margin="5,0,0,0"
EnableNewItemAddition="True"
AddNewItemText="הוסף חדש"
AddNewItemButtonClicked="EnhancedComboBox_AddNewItemButtonClicked"
SelectedValue="{Binding SelectedVal,ElementName=MyComboUserControl}"
SelectedValuePath="ID"
DisplayMemberPath="Value" SelectionChanged="combo_SelectionChanged">
</local:EnhancedComboBox>
הוקמבו מופיע, יש לו ערכים כשפותחים אותו אבל אי אפשר לבחור איבר או להחליף את הבחירה שהיתה בו. זה נראה שהוא פשוט לא מקבל בכלל את ה-event. הוספתי לו event של combo_SelectionChanged ובאמת אם הוא בתוך הגריד הוא לא מגיע אליו.
ראיתי בחיפוש באינטרנט שיש מצב שה-datagrid לא מעביר לקומבו את האירועים. הבעיה היא שאני לא מבינה מה עושים בכזה מקרה, איך משחררים את האירוע?
פורסם במקור בפורום CODE613 ב11/07/2013 00:17 (+03:00)
זה עובד מעולה!
תודה רבה
פורסם במקור בפורום CODE613 ב11/07/2013 20:36 (+03:00)
זה לא מזיז לו! נשאר לי ה-header (גם ב-designer וכמובן בהרצה)
נראה שהוא בכלל לא משתמש ב-headerTamplate
פורסם במקור בפורום CODE613 ב10/07/2013 23:26 (+03:00)
כן גם בזמן design אני לא רואה את ה-icon.
פורסם במקור בפורום CODE613 ב10/07/2013 21:02 (+03:00)
לא כל כך הבנתי איפה לשים את ה-HeaderTemplate. ניסיתי לשים אותו בהגדרות של ה-tabitem כך:
<tabs:ChromeTabItem Header="שאלון " >
<tabs:ChromeTabItem.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="..\Images\questionnare.ico"/>
<TextBlock Text="{TemplateBinding Content}" />
</StackPanel>
</DataTemplate>
</tabs:ChromeTabItem.HeaderTemplate>
ובהרצה אני רואה רק טאב שיש לו header שאלון בלי התמונה וכך גם ב-tooltip.
האמת לא כל כך נורא שלא תופיע התמונה, זה לא מאוד עקרוני בשבילי רק מעניין מדוע.
פורסם במקור בפורום CODE613 ב10/07/2013 12:56 (+03:00)
זה באמת הוסיף את ה-tooltip אבל אם היה header שהוגדר כך (מכיל טקסט + תמונה קטנה):
<tabs:ChromeTabItem.Header>
<StackPanel Orientation="Horizontal">
<Image Source="..\Images\questionnare.ico"/>
<TextBlock Text="שאלון"/>
</StackPanel>
</tabs:ChromeTabItem.Header>
אז ברגע שה -tooltip מופיע, ה-header נהיה ריק והתוכן שלו לא חוזר גם בהמשך, הערך ב-tooltip נשאר.
(אותה התנהגות קוראת גם אם אני שמה את השורה הזו בהגדרה של ה-label במיקום שהראיתי למעלה)
ממש לא ברור לי למה, זה נראה כאילו ה-tooltip שאב ממנו את התוכן של ה-header.
פורסם במקור בפורום CODE613 ב08/07/2013 12:39 (+03:00)
אני שמתי את השורה הזו בהגדרה של ה-label:
<Label Margin="10 0 0 0" VerticalAlignment="Center" Content="{TemplateBinding Header}" [u:1j4sfrr9]ToolTip="{Binding Content.Text}"[/u:1j4sfrr9] Grid.Column="1" />
אי אפשר לשים את זה בשורה הרביעית, הוא נותן שגיאה:
The property 'ToolTip' was not found in type 'ControlTemplate'.
פורסם במקור בפורום CODE613 ב07/07/2013 20:39 (+03:00)
במקרה ויש טקסט מידי ארוך לטאב יש גודל מקסימלי ואז הטקס חתוך. ב-chrome הפתרון הוא tooltip ורציתי לחקות את אותה התנהגות.
פורסם במקור בפורום CODE613 ב07/07/2013 14:43 (+03:00)
יש לי פרויקט שהורדתי מהאינטרנט עבור טאבים בצורה של chrome. הייתי רוצה להוסיף tooltip עבור כל טאב בהתאם לתוכן של ה-header.
ב-style יש כזו הגדרה
<Style TargetType="{x:Type local:ChromeTabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ChromeTabItem}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="20" />
<ColumnDefinition Width="5" />
</Grid.ColumnDefinitions>
<Path Name="TabFill" Margin="0 0 0 1" Grid.ColumnSpan="4" VerticalAlignment="Top" Stretch="Fill" Data="M39,96 C48.75,96 59.25,0 76,0 92.75,0 247,0 258,0 269,0 285.5,95.75 295,96">
<Path.Fill>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFEEEEEE" Offset="0"/>
<GradientStop Color="#FFDDDDDD" Offset="1"/>
</LinearGradientBrush>
</Path.Fill>
</Path>
<Path Name="TabPath" Grid.ColumnSpan="4" VerticalAlignment="Top" Stretch="Fill" Stroke="#FF999999" Data="M39,96 C48.75,96 59.25,0 76,0 92.75,0 247,0 258,0 269,0 285.5,95.75 295,96" />
<Path Name="TabHighlight" Margin="0 0 0 1" Grid.ColumnSpan="4" VerticalAlignment="Top" Stretch="Fill" Stroke="White" Data="M39,96 C48.75,96 59.25,0 76,0 92.75,0 247,0 258,0 269,0 285.5,95.75 295,96">
<Path.RenderTransformOrigin>
<Point X=".5" Y=".5" />
</Path.RenderTransformOrigin>
<Path.RenderTransform>
<TransformGroup>
<TranslateTransform Y=".5" />
<ScaleTransform ScaleX=".96" ScaleY=".94" />
</TransformGroup>
</Path.RenderTransform>
</Path>
<Label Margin="10 0 0 0" VerticalAlignment="Center" Content="{TemplateBinding Header}" Grid.Column="1" />
<Button KeyboardNavigation.IsTabStop="False" Margin="0 0 10 0" Style="{StaticResource CloseButtonStyle}" Grid.Column="2" Command="{x:Static local:ChromeTabItem.CloseTabCommand}" />
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Fill" TargetName="TabFill" Value="White" />
<Setter Property="Margin" TargetName="TabFill" Value="0 0 0 -1" />
<Setter Property="Margin" TargetName="TabPath" Value="0" />
<Setter Property="Stroke" TargetName="TabHighlight" Value="Transparent" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
ניסיתי להוסיף tooitip לשורה הזו:
<Label Margin="10 0 0 0" VerticalAlignment="Center" Content="{TemplateBinding Header}" ToolTip="{Binding Content.Text}" Grid.Column="1" />
אבל לא קרה כלום. ניסיתי גם לשים במקום זה את השורה
ToolTip="{TemplateBinding Header}"
אז הוא באמת הוסיף tooltip אבל אם היה לטאב template אז ברגע שה-tooltip הופיע נעלם הטקסט של ה-header. לא ברור לי למה.
אשמח לקבל הסבר איך זה עובד, תודה.
פורסם במקור בפורום CODE613 ב07/07/2013 11:38 (+03:00)
אם זה המצב אז זה באמת לא יחסוך לי כלום.
אני רציתי לכתוב פחות קוד ויותר xaml אבל אם צריך לכתוב xaml ארוך עבור כל ליסט אז כבר עדיף שורה אחת ב-code behind.
פורסם במקור בפורום CODE613 ב10/07/2013 12:58 (+03:00)
כן התשובה חיובית עבור שתי השאלות.
אשמח לראות דוגמא איך עושים את זה. לא כל כך הבנתי.
מה שאני עושה עכשיו בקוד הוא כך:
TransactionTypeCombo.ItemsSource = GetSourcesOfValues("ppp", "xxx");
PaymentTypeCombo.ItemsSource = GetSourcesOfValues("ppp", "yyy");
הפונקציה מחזירה לי list של שורות שמתאימות לתנאי מסוים מתוך ה-DB.
פורסם במקור בפורום CODE613 ב07/07/2013 14:42 (+03:00)
יש לי בקוד ה-xaml כמה ליסטים המבוססים על רשימת ערכים שנבנית ע"י פונקציה שמקבלת 2 ערכי טקסט שונים (לכל ליסט ערכים שונים).
בינתיים הקריאה לפונקציה ואיתחול ה-itemSource של הליסטים נעשים ב-load ב- code behind.
אני רוצה פתרון לזה דרך ה-xaml. ראיתי שיש אפשרות של ObjectDataProvider שמקבל ערכים אבל לא ברור לי איך הערכים ישתנו לכל ליסט. זה נראה שצריך להגדיר ObjectDataProvider חדש עבור כל ליסט - וזה לא נשמע הגיוני.
אשמח לשמוע רעיונות אחרים לביצוע.
תודה רבה.
פורסם במקור בפורום CODE613 ב06/07/2013 23:57 (+03:00)
בסוף באמת ביטלתי את יכולת העריכה של העמודה והוספתי כפתור בתוכו שבלחיצה עליו פותח חלון לבחירת path חדש.
<DataGridTemplateColumn Header="שמור בתיקיה" Width="*" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock>
<Hyperlink Click="DG_Hyperlink_Click" TextDecorations="None" NavigateUri="{Binding SavedPath}">
<TextBlock Text="{Binding SavedPath}" FlowDirection="LeftToRight" TextDecorations="Underline" />
</Hyperlink>
</TextBlock>
<Button Content="..." Width="30" Click="BrowseFolder_Click" Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridCell}}, Path=Background}"/>
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
private void DG_Hyperlink_Click(object sender, RoutedEventArgs e)
{
Hyperlink link = e.OriginalSource as Hyperlink;
System.Diagnostics.Process.Start(link.NavigateUri.LocalPath);
}
private void BrowseFolder_Click(object sender, RoutedEventArgs e)
{
System.Windows.Forms.OpenFileDialog dialog = new System.Windows.Forms.OpenFileDialog();
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
((DataLayer.Documents)((Button)e.Source).DataContext).SavedPath = dialog.InitialDirectory + dialog.FileName;
}
תודה רבה על ההדרכה.
פורסם במקור בפורום CODE613 ב11/07/2013 10:28 (+03:00)
יש לי datagrid ואני רוצה עמודה מסוג DataGridHyperlinkColumn שמציגה לינק ל-filesystem של המחשב.
עשיתי את זה כך:
private void DG_Hyperlink_Click(object sender, RoutedEventArgs e)
{
Hyperlink link = e.OriginalSource as Hyperlink;
System.Diagnostics.Process.Start(link.NavigateUri.AbsoluteUri);
}
<DataGridHyperlinkColumn Header="שמור בתיקיה" Binding="{Binding SavedPath}">
<DataGridHyperlinkColumn.ElementStyle>
<Style>
<EventSetter Event="Hyperlink.Click" Handler="DG_Hyperlink_Click" />
</Style>
</DataGridHyperlinkColumn.ElementStyle>
</DataGridHyperlinkColumn>
השאלה היא איך עושים שבלחיצה על המקום הריק בעמודה או במקרה שאין תוכן בעמודה זה יפתח לי folderBrowser יבחר תיקיה או קובץ וימלא את ה-SavedPath בתוכן החדש.
אני משערת שצריך להשתמש ב- DataGridHyperlinkColumn.EditingElementStyle רק אני לא מבינה איך משתמשים בו.
תודה רבה
פורסם במקור בפורום CODE613 ב26/06/2013 21:45 (+03:00)