How can I access the checkboxes with a XML databound RadTreeView?
Dear Madam or Sir,
What I try or do I never get up the tree! Also I suspect that ChilderenByType() is not capable to give you access to all CheckBox nodes. Not even layer-by-layer.
(I know the proper way is a recursive function)
But I see no other way than to roll out the recursion because I got the XMLNodeItems separate from the (ItemsOptionListType="CheckList") checkboxes and I must set IsChecked = true for the CheckBoxes with a value saved in the database. When I can get up the tree the next challenge to keep the visual tree (correct checkboxes checked) in sync with what the user saved.
WHY DOES MY CODE NOT WORK AND WHAT SHOULD I DO?
XAML
<
telerik:RadWindow
x:Class
=
"Jbusiness.Views.Gegevens.AdviseurTreeView"
xmlns:local
=
"clr-namespace:Jbusiness.Views.Gegevens"
xmlns:telerik
=
"http://schemas.telerik.com/2008/xaml/presentation"
xmlns:telerik2
=
"clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Navigation"
mc:Ignorable
=
"d"
Height
=
"800"
Width
=
"400"
>
<
telerik:RadWindow.Resources
>
<
local:RadTreeViewXmlDataSource
x:Key
=
"treeViewData"
Source
=
"ItemsXML.xml"
/>
<
telerik:HierarchicalDataTemplate
x:Key
=
"Item"
ItemsSource
=
"{Binding Items}"
>
<
TextBlock
Text
=
"{Binding Header}"
/>
</
telerik:HierarchicalDataTemplate
>
</
telerik:RadWindow.Resources
>
<
Grid
x:Name
=
"LayoutRoot"
Background
=
"White"
VerticalAlignment
=
"Center"
HorizontalAlignment
=
"Center"
Width
=
"200"
>
<
Grid.RowDefinitions
>
<
RowDefinition
Height
=
"50"
/>
<
RowDefinition
Height
=
"700"
/>
</
Grid.RowDefinitions
>
<
StackPanel
Grid.Row
=
"0"
Orientation
=
"Horizontal"
Width
=
"200"
Height
=
"50"
>
<
HyperlinkButton
x:Name
=
"HypButtonAnnuleren"
Content
=
"Annuleren"
Margin
=
"5,5,5,5"
Foreground
=
"{StaticResource HypLinkAnnuleren}"
Click
=
"HypButtonAnnuleren_Click"
/>
<
HyperlinkButton
x:Name
=
"HypButtonOpslaan"
Content
=
"Opslaan"
Margin
=
"0,5,0,5"
Foreground
=
"{StaticResource HypLinkOpslaan}"
Click
=
"HypButtonOpslaan_Click"
/>
</
StackPanel
>
<
telerik:RadTreeView
Grid.Row
=
"1"
ItemTemplate
=
"{StaticResource Item}"
ItemsSource
=
"{Binding Source={StaticResource treeViewData}}"
SelectionMode
=
"Extended"
IsLineEnabled
=
"True"
ItemsOptionListType
=
"CheckList"
IsOptionElementsEnabled
=
"True"
IsRootLinesEnabled
=
"True"
Margin
=
"10"
x:Name
=
"RadTreeView1"
IsTriStateMode
=
"True"
/>
</
Grid
>
</
telerik:RadWindow
>
C# CODE BEHIND (THIS CODE DOES NOT WORK!)
using
System;
using
System.Collections.Generic;
using
System.Linq;
using
System.Net;
using
System.Windows;
using
System.Windows.Controls;
using
System.Windows.Documents;
using
System.Windows.Input;
using
System.Windows.Media;
using
System.Windows.Media.Animation;
using
System.Windows.Shapes;
using
System.Xml.Serialization;
using
System.Collections.ObjectModel;
using
System.IO;
using
Telerik.Windows.Controls;
using
Jbusiness.Web;
using
System.ServiceModel.DomainServices.Client;
using
System.Windows.Automation;
namespace
Jbusiness.Views.Gegevens
{
public
partial
class
AdviseurTreeView : RadWindow
{
private
int
AdvsID;
public
AdviseurTreeView(
int
advsID)
{
InitializeComponent();
this
.AdvsID = advsID;
this
.RadTreeView1.Loaded +=
new
System.Windows.RoutedEventHandler(RadTreeView1_Loaded);
}
private
void
RadTreeView1_Loaded(
object
sender, System.Windows.RoutedEventArgs e)
{
JortnerDomainContext jdc =
new
JortnerDomainContext();
LoadOperation<Jbusiness.Web.Adviseur> lop = jdc.Load(jdc.GetAdviseursQuery().Where(ad => ad.AdvsId ==
this
.AdvsID));
lop.Completed += (s, a) =>
{
string
[] superstringArray = (jdc.Adviseurs.ElementAt<Jbusiness.Web.Adviseur>(0).AdvsGebiedenExport
as
string
).Split(
new
Char[] {
','
});
int
i = 0;
int
j = 0;
object
[] xni =
this
.RadTreeView1.Items.ToArray();
this
.RadTreeView1.ExpandAll();
foreach
(RadTreeViewItem rtvi
in
this
.RadTreeView1.ChildrenOfType<RadTreeViewItem>())
{
i++;
foreach
(
string
value
in
superstringArray)
{
if
(((XmlNodeItem)xni[i - 1]).value == value)
{
rtvi.IsChecked =
true
;
}
}
j = 0;
object
[] xni2 = rtvi.Items.ToArray();
RadTreeViewItem rtvi2 =
this
.RadTreeView1.ContainerFromItemRecursive(xni[i - 1]);
foreach
(RadTreeViewItem rtvi3
in
rtvi2.ChildrenOfType<RadTreeViewItem>())
{
j++;
foreach
(
string
value
in
superstringArray)
{
if
(((XmlNodeItem)xni2[j - 1]).value == value)
{
rtvi3.IsChecked =
true
;
}
}
}
}
};
}
private
void
HypButtonAnnuleren_Click(
object
sender, RoutedEventArgs e)
{
}
private
void
HypButtonOpslaan_Click(
object
sender, RoutedEventArgs e)
{
string
superstring =
""
;
foreach
(XmlNodeItem xni
in
this
.RadTreeView1.CheckedItems)
{
if
(xni.value !=
null
) superstring += xni.value.ToString() +
","
;
}
JortnerDomainContext jdc =
new
JortnerDomainContext();
LoadOperation<Jbusiness.Web.Adviseur> lop = jdc.Load(jdc.GetAdviseursQuery().Where(ad => ad.AdvsId ==
this
.AdvsID));
lop.Completed += (s, a) =>
{
jdc.Adviseurs.ElementAt<Jbusiness.Web.Adviseur>(0).AdvsGebiedenExport = superstring;
if
(jdc.HasChanges)
{
jdc.SubmitChanges();
}
};
}
}
public
class
XmlNodeItem
{
public
XmlNodeItem()
{
this
.Items =
new
ObservableCollection<XmlNodeItem>();
}
[XmlAttribute(AttributeName =
"Header"
)]
public
string
Header
{
get
;
set
;
}
[XmlAttribute(AttributeName =
"value"
)]
public
string
value
{
get
;
set
;
}
public
ObservableCollection<XmlNodeItem> Items
{
get
;
set
;
}
}
[XmlRoot(ElementName =
"Items"
)]
public
class
XmlNodeItemList : ObservableCollection<XmlNodeItem>
{
public
void
AddRange(IEnumerable<XmlNodeItem> range)
{
foreach
(XmlNodeItem node
in
range)
{
this
.Add(node);
}
}
}
public
class
RadTreeViewXmlDataSource : XmlNodeItemList
{
private
string
source;
public
string
Source
{
get
{
return
this
.source;
}
set
{
this
.source = value;
AddRange(RetrieveData(Application.GetResourceStream(
new
Uri(value, UriKind.Relative)).Stream));
}
}
private
XmlNodeItemList RetrieveData(Stream xmlStream)
{
XmlSerializer serializer =
new
XmlSerializer(
typeof
(XmlNodeItemList));
StreamReader reader =
new
StreamReader(xmlStream);
XmlNodeItemList list = (XmlNodeItemList)serializer.Deserialize(reader);
return
list;
}
}
}
XML:
<?
xml
version
=
"1.0"
encoding
=
"UTF-8"
?>
<
Items
>
<
XmlNodeItem
Header
=
"Exportinstellingen"
>
<
Items
>
<
XmlNodeItem
Header
=
"Gezin"
>
<
Items
>
<
XmlNodeItem
Header
=
"Partners"
>
<
Items
>
<
XmlNodeItem
Header
=
"Persoonlijk"
value
=
"10"
/>
<
XmlNodeItem
Header
=
"Pensioen"
value
=
"20"
/>
<
XmlNodeItem
Header
=
"Werk"
value
=
"30"
/>
</
Items
>
</
XmlNodeItem
>
<
XmlNodeItem
Header
=
"Kinderen"
value
=
"40"
/>
<
XmlNodeItem
Header
=
"Woonsituatie"
value
=
"50"
/>
</
Items
>
</
XmlNodeItem
>
<
XmlNodeItem
Header
=
"Adviesgebieden"
>
<
Items
>
<
XmlNodeItem
Header
=
"Contracten"
value
=
"60"
/>
<
XmlNodeItem
Header
=
"Financieel"
value
=
"70"
/>
<
XmlNodeItem
Header
=
"Producten en diensten"
value
=
"80"
/>
<
XmlNodeItem
Header
=
"Documenten"
value
=
"90"
/>
</
Items
>
</
XmlNodeItem
>
<
XmlNodeItem
Header
=
"Niet adviesgebieden"
>
<
Items
>
<
XmlNodeItem
Header
=
"Contracten"
value
=
"100"
/>
<
XmlNodeItem
Header
=
"Financieel"
value
=
"110"
/>
<
XmlNodeItem
Header
=
"Producten en diensten"
value
=
"120"
/>
<
XmlNodeItem
Header
=
"Documenten"
value
=
"130"
/>
</
Items
>
</
XmlNodeItem
>
<
XmlNodeItem
Header
=
"Budget"
value
=
"140"
/>
<
XmlNodeItem
Header
=
"Vermogen"
value
=
"150"
/>
<
XmlNodeItem
Header
=
"Documenten"
>
<
Items
>
<
XmlNodeItem
Header
=
"Adviesgebieden"
value
=
"160"
/>
<
XmlNodeItem
Header
=
"Niet adviesgebieden"
value
=
"170"
/>
<
XmlNodeItem
Header
=
"Alle documenten"
value
=
"180"
/>
</
Items
>
</
XmlNodeItem
>
</
Items
>
</
XmlNodeItem
>
</
Items
>
See code.
Many thanks in advance!
Johan.