Hello, I have a XamDataTree defined as follows:
<ig:XamDataTree x:Name="_MenuTree" ItemsSource="{Binding Menus}" SelectedDataItems="{Binding SelectedMenuItems}" NodeLineVisibility="Visible" IsExpandedMemberPath="IsExpanded" NodeCheckedChanged="TreeNodeCheckedChanged"> <ig:XamDataTree.CheckBoxSettings> <ig:CheckBoxSettings CheckBoxVisibility="Visible" CheckBoxMode="Auto" /> </ig:XamDataTree.CheckBoxSettings> <ig:XamDataTree.SelectionSettings> <ig:TreeSelectionSettings NodeSelection="Multiple" /> </ig:XamDataTree.SelectionSettings> <ig:XamDataTree.GlobalNodeLayouts> <ig:NodeLayout Key="MenuLayout" TargetTypeName="clsMenuItem" DisplayMemberPath="Description" CheckBoxMemberPath="IsSelected"> </ig:NodeLayout> </ig:XamDataTree.GlobalNodeLayouts> </ig:XamDataTree>
The Menus property is in the ViewModel and is an ObservableCollection of clsMenuItem. clsMenuItem has the following properties: ID (int), Description (string) and ChildItems (ObservableCollection(of clsMenuItem))
I looked at one of the other similar posts on the forums board, but in my case, I don't see anything on the screen when then form loads, even though the Menus property has proper stuff in it.
What am I missing / doing wrong?
Hello Manasi,
Your code appears to be correct, unless there is some sort of issue with data context not being propagated down to the tree, I don’t see any issue with this. I created a sample using the description of your data and your XAML and the tree appeared as expected. Please review the sample and see if you notice may differences which may attribute to your issue.
Let me know if you have any questions.
Sincerely
Valerie
Software Developer
Infragistics Inc
hi Valerie, apparently the ItemSource was being filled after the controls were loaded. I just assigned the "Menus" property in Form Loaded event and it worked fine. Now I have another question:
1) When the form loads, if there are only some child nodes checked and others unchecked, the parent node does not show the "-" (partially selected). But if I check / uncheck on the form, then the sign shows up. Is there something I have to do in the code-behind to show the right states of all check-boxes when the form loads?
2) Can I show Green Check and Red Cross images when the user checks / unchecks something on the form? How can I assign image property to a node depending on whether it is checked or unchecked?
Thanks,
Manasi
PS: I tried to add an image here, didn't show up??
The initial state of the checkbox is being determined by the underlying value that it is bound to. If you use a nullable bool and set the initial value (true = all checked, false = non checked, null = some checked) to indicate the value of the checked children then the tree will appear correctly initially.
For you second question, if you are looking to change the appearance of the Checkbox you can create your own style which re-templates the check box control and then tell the tree to use this style by creating a style targeting the XamDataTreeNodeControl and within this style set the CheckBoxStyle property to use your new checkbox style.
Otherwise if you want to add an additional image to the contents of the Node you can set the ContentTemplate property in a style targeting the XamDataTreeNodeControl and then add your own custom DataTemplate to display the node values along with the image. In order to display certain images based on whether the node is checked, you can use a relative source binding to the XamDataTreeNodeControl and set the visibility based on whether the node is checked. The XamDataTreeNodeControl’s datacontext is set to an instance of a XamDataTreeNodeContext which contains a ‘Data’ property to access the underlying data object and a ‘Node’ property to access properties of the node. You can either bind to the property in your object which is bound to the checkbox or to the node’s IsChecked property, For example:
Visibility="{Binding DataContext.Data.IsSelected,RelativeSource={RelativeSource AncestorType={x:Type ig:XamDataTreeNodeControl}},Converter={StaticResource VisConverter}}"/>
Or
Visibility="{Binding DataContext.Node.IsChecked,RelativeSource={RelativeSource AncestorType={x:Type ig:XamDataTreeNodeControl}},Converter={StaticResource VisConverter}}
Please let me know if you have any questions,
Sincerely,
That worked. Thank you.
The definition of that style for XamDataTreeNodeControl in the XamDataTree.Resources is at a lower scope than the one defined in your Grid.Resources, so yes, this will effectively override the one in your Grid.Resources. This is not to say that you can't have both, though.
I would recommend giving the style in your Grid.Resources an x:Key. This will allow you to base the one in your XamDataTree.Resources off of the one in your Grid.Resources by using BasedOn="{StaticResource gridResourceKey}" in the <Style> tag. Note, though, that this will now remove the style from your secondary XamDataTree, as the style in the Grid.Resources will no longer be implicit. You can reapply this style to your secondary XamDataTree by setting the NodeStyle property of your NodeLayout in the secondary tree to "{StaticResource gridResourceKey}." This will allow you to have both the PreviewMouse event and the context menu on the tree that you need it on.
Please let me know if you have any other questions or concerns on this matter.
Sincerely,AndrewAssociate DeveloperInfragistics Inc.www.infragistics.com/support
Hi Andrew,
I can now run the selection functionality fine. But if I add the following code to the first Tree's XAML, the PreviewMouseButtonDown event stops working.
<ig:XamDataTree.Resources> <Style TargetType="{x:Type ig:XamDataTreeNodeControl}"> <Setter Property="ContextMenu"> <Setter.Value> <ContextMenu Tag="{Binding Node}"> <MenuItem Header="Remove" /> </ContextMenu> </Setter.Value> </Setter> </Style> </ig:XamDataTree.Resources>
I think this code overrides the Grid.Resources?
Can I have the PreviewMouse event and also the context menu? I need them both in my project.
Thanks
I have taken a look at the sample project that you have attached, and the issue here is not so much the PreviewMouseLeftButtonDown event or the NodeCheckedChanged event. The reason your checkboxes are not changing their state is because you are showing a message box on the PreviewMouseLeftButtonDown event. This message box will essentially demand focus, and since the "PreviewMouse" related events actually happen before the actual mouse events, the mouse action never gets triggered, and so the node never gets checked.
After removing these message boxes from your sample, I see that the NodeCheckedChanged event now gets fired, but there is still an issue. Currently, the "SelectedCopy" collection that you are using for your separate tree is getting populated inside of the setter for the bound object array used for the first tree's SelectedDataItems property. This is going to cause issues, because you will be adding more and more nodes to the tree each time this SelectedDataItems array changes. Currently, you are also adding all of the nodes that exist in the SelectedDataItems collection, so you are getting essentially the same behavior as before, but since you are adding them each time this array changes, you will actually end up with many more nodes in your separate tree than you originally had by binding the separate one to the SelectedDataItems array of the original tree.
It appears to me that perhaps you are slightly confused on what I had meant by usage of the PreviewMouseLeftButtonDown and NodeCheckedChanged events from a couple of posts ago. In an attempt to alleviate that possible confusion, I have created a sample project that is based on the one you have sent me. Note, this sample project is very barebones, in that I have removed all of the styling and anything extra that doesn't pertain to the actual selection-based operations between the two trees. This was intentional, as the point of this sample project is to demonstrate what I had tried to describe from a couple of posts to this forum ago, without the inclusion of the extra styling clutter in the code used.
The sample project demonstrating these operations is attached. I hope it helps you.
I modified the sample with the changes suggested by you, but I still think I am doing it wrong. Especially with the PreviewMouseLeftButtonDown event. If I click on a checkbox, it fires the event, but does not change the checkbox state (doesn't fire the checkedchanged event).
Can you look at the sample and let me know?