I have the follwing code which works fine...
<core:HierarchicalDataTemplate x:Key="hdt" ItemsSource="{Binding ChildItems}" >
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ImagePath}" />
<TextBlock Text="{Binding ItemName}" Margin="5,0,0,0" />
</StackPanel>
</core:HierarchicalDataTemplate>
...
<telerik:RadTreeView Grid.Row="1" x:Name="TreeView"
ItemsSource="{Binding Path=Items}"
ItemTemplate="{StaticResource hdt}"
IsEditable="True" >
<telerik:RadTreeView.ItemContainerStyle>
<Style TargetType="telerik:RadTreeViewItem" x:Key="TreeViewItemStyle">
<Setter Property="IsExpanded" Value="true"></Setter>
</Style>
</telerik:RadTreeView.ItemContainerStyle>
</telerik:RadTreeView>
However, if I change the IsExpanded property to bind to my ViewModel, it fails - this will actually crash the browser....
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"></Setter>
If I define as a static resource I get "An unhandled exception occurred in iexplore.exe [8080]"...
<Style TargetType="telerik:RadTreeViewItem" x:Key="TreeViewItemStyle">
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"></Setter>
</Style>
...
<telerik:RadTreeView Grid.Row="1" x:Name="TreeView"
ItemsSource="{Binding Path=Items}"
ItemTemplate="{StaticResource hdt}"
ItemContainerStyle="{StaticResource TreeViewItemStyle}"
IsEditable="True" >
</telerik:RadTreeView>
Any ideas how I can resolve this?
9 Answers, 1 is accepted
0
Hello Raj,
Can you please try your binding without the 'Path=' part:
<Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter>
The binding seems to work fine when I tested your scenario. If the problem persists, would you please send me a small project which demonstrates your issue, so that I can investigate it further?
All the best,
Tihomir Petkov
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
Can you please try your binding without the 'Path=' part:
<Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter>
The binding seems to work fine when I tested your scenario. If the problem persists, would you please send me a small project which demonstrates your issue, so that I can investigate it further?
All the best,
Tihomir Petkov
the Telerik team
Instantly find answers to your questions on the new Telerik Support Portal.
Check out the tips for optimizing your support resource searches.
0
Raj
Top achievements
Rank 1
answered on 20 Mar 2009, 04:51 PM
Hi Tihomir - thanks for your input. I was wondering if my issue might have something to do with embedding the treeview into a custom control. So my generic.xaml looks similar to...
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:telerik="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls.Navigation"
xmlns:core="clr-namespace:Telerik.Windows.Controls;assembly=Telerik.Windows.Controls">
...
<Style TargetType="local:Mycontrol">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:MyControl">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.Resources>
<core:HierarchicalDataTemplate x:Key="hdt" ItemsSource="{Binding ChildItems}" >
<StackPanel Orientation="Horizontal">
<Image Source="{Binding ImagePath}" />
<TextBlock Text="{Binding ItemName}" Margin="5,0,0,0" />
</StackPanel>
</core:HierarchicalDataTemplate>
<Style TargetType="telerik:RadTreeViewItem" x:Key="TreeViewItemStyle">
<Setter Property="IsExpanded" Value="{Binding IsExpanded}"></Setter>
</Style>
...
<telerik:RadTreeView Grid.Row="1" x:Name="TreeView"
ItemsSource="{Binding Path=Items}"
ItemTemplate="{StaticResource hdt}"
ItemContainerStyle="{StaticResource TreeViewItemStyle}"
IsEditable="True" >
</telerik:RadTreeView>
I'll put some code together that I can submit to you.
0
Hi Raj,
ControlTemplates use a naming scope different from the one of your application and that is why you cannot reference resources from your ControlTemplate the way you are trying. So, you have to move the styles you want to reference in your application out of any ControlTemplates.
Let me know if you have further questions.
All the best,
Tihomir Petkov
the Telerik team
Check out Telerik Trainer , the state of the art learning tool for Telerik products.
ControlTemplates use a naming scope different from the one of your application and that is why you cannot reference resources from your ControlTemplate the way you are trying. So, you have to move the styles you want to reference in your application out of any ControlTemplates.
Let me know if you have further questions.
All the best,
Tihomir Petkov
the Telerik team
Check out Telerik Trainer , the state of the art learning tool for Telerik products.
0
JC
Top achievements
Rank 1
answered on 06 Oct 2010, 11:01 AM
Hello !
Sorry to use this old post but I'm in a similar problem !
I try to bind IsExpanded with IsSelected :
But at runtine, throw a exception that indicate the property is readonly !! ... why ???
Have you an idea ?
I use the version 2010.2.812.1040
Thanks
Sorry to use this old post but I'm in a similar problem !
I try to bind IsExpanded with IsSelected :
<
Style
TargetType
=
"tlk:RadTreeViewItem"
>
<
Setter
Property
=
"IsExpanded"
Value
=
"{Binding IsSelected, Mode=OneWay}"
/>
</
Style
>
But at runtine, throw a exception that indicate the property is readonly !! ... why ???
{System.NotSupportedException: Unable to set read-only property ''.
à MS.Internal.XamlMemberInfo.SetValue(Object target, Object value)
à MS.Internal.XamlManagedRuntimeRPInvokes.SetValue(XamlTypeToken inType, XamlQualifiedObject& inObj, XamlPropertyToken inProperty, XamlQualifiedObject& inValue)}
Have you an idea ?
I use the version 2010.2.812.1040
Thanks
0
Hi JC,
Binding in the Setter of an ItemContainerStyle is not allowed in Silverlight but only in WPF. That is why we have the ContainerBindings. If I've understood your scenario correctly, you want whenever you expand an item, this item to be selected automatically. If this is the case, I've prepared a small project demonstrating this functionality in Silverlight. Have a look at it and let me know if it answers your question. If not, could you please share more details on the scenario you are trying to achieve. I'd be glad to further assist you.
Regards,
Kiril Stanoev
the Telerik team
Binding in the Setter of an ItemContainerStyle is not allowed in Silverlight but only in WPF. That is why we have the ContainerBindings. If I've understood your scenario correctly, you want whenever you expand an item, this item to be selected automatically. If this is the case, I've prepared a small project demonstrating this functionality in Silverlight. Have a look at it and let me know if it answers your question. If not, could you please share more details on the scenario you are trying to achieve. I'd be glad to further assist you.
Regards,
Kiril Stanoev
the Telerik team
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Public Issue Tracking
system and vote to affect the priority of the items
0
JC
Top achievements
Rank 1
answered on 07 Oct 2010, 03:45 PM
Ok,
I understand we can't bind in setter style ... it's a pity ... but anyway, it shouldn't work ...
In fact, my initiale need is view the selected item event if the menu is collapsed so I search a way to expand it
But when I set SelectedItem, i don't know it path so I can't use method ExpandItemByPath.
Have ou another method ?
Thanks
I understand we can't bind in setter style ... it's a pity ... but anyway, it shouldn't work ...
In fact, my initiale need is view the selected item event if the menu is collapsed so I search a way to expand it
But when I set SelectedItem, i don't know it path so I can't use method ExpandItemByPath.
Have ou another method ?
Thanks
0
JC
Top achievements
Rank 1
answered on 11 Oct 2010, 08:22 AM
Hello, finally I find this way :
I forgot to say that I use a HierarchicalDataTemplate.
Have you a better solution ?
A+
public
void
SelectedItemInternal(
object
toSelect)
{
this
.Menu.SelectionChanged -= Menu_SelectionChanged;
if
(
this
.Menu !=
null
&&
this
.Menu.SelectedItem != toSelect)
{
// Set the selectedItem
this
.Menu.SelectedItem = toSelect;
this
.Menu.CollapseAll();
AnimationManager.IsGlobalAnimationEnabled =
false
;
// Expand menu to selectedItem
ExpandToObject(
this
.Menu, toSelect);
AnimationManager.IsGlobalAnimationEnabled =
true
;
}
this
.Menu.SelectionChanged += Menu_SelectionChanged;
}
private
bool
ExpandToObject(ItemsControl control,
object
toFind)
{
bool
retval =
false
;
for
(
int
i = 0; i < control.Items.Count; i++)
{
// Foreach item find container
var visualItem = control.ItemContainerGenerator.ContainerFromIndex(i)
as
RadTreeViewItem;
if
(visualItem !=
null
)
{
if
(!visualItem.IsExpanded)
{
// Expand causes creation of children items
// if not, ContainerFromIndex will be null
visualItem.IsExpanded =
true
;
visualItem.UpdateLayout();
}
if
(visualItem.DataContext == toFind)
{
// Verify DataContext of item
retval =
true
;
visualItem.IsExpanded =
false
;
}
if
(!retval)
{
// Recurcivity to children
if
(visualItem.Items.Count > 0)
retval = ExpandToObject(visualItem, toFind);
}
if
(!retval)
// If the branch no contain item, collapse it
visualItem.IsExpanded =
false
;
else
break
;
}
}
return
retval;
}
I forgot to say that I use a HierarchicalDataTemplate.
Have you a better solution ?
A+
0
JC
Top achievements
Rank 1
answered on 13 Oct 2010, 08:49 AM
The final shot with synchonous blocking, and multi generators handler :
Hope this code help anyone ...
public
static
class
TreeViewHelper
{
private
static
Dictionary<ItemContainerGenerator, AutoResetEvent> _waiters =
new
Dictionary<ItemContainerGenerator, AutoResetEvent>();
public
static
void
SelectedAndExpand(
this
RadTreeView thisTreeView,
object
toSelect)
{
// Set the selectedItem, collapse all and desactivate animations
thisTreeView.SelectedItem = toSelect;
thisTreeView.CollapseAll();
AnimationManager.IsGlobalAnimationEnabled =
false
;
// Lauch background worker to not stop the UI thread when waiting for the ItemContainerGenerator
var worker =
new
BackgroundWorker() { WorkerSupportsCancellation =
false
, WorkerReportsProgress =
false
};
worker.DoWork +=
delegate
{
thisTreeView.Dispatcher.BeginInvoke(() => ExpandToObject(thisTreeView, toSelect));
};
worker.RunWorkerAsync();
worker.RunWorkerCompleted +=
delegate
{
AnimationManager.IsGlobalAnimationEnabled =
true
;
};
}
private
static
void
CheckContainerGeneratorBuzy(
this
ItemContainerGenerator generator)
{
if
(generator !=
null
&& generator.Status != GeneratorStatus.ContainersGenerated)
{
generator.StatusChanged -= ItemContainerGeneratorChanged;
generator.StatusChanged += ItemContainerGeneratorChanged;
if
(!_waiters.ContainsKey(generator))
_waiters.Add(generator,
new
AutoResetEvent(
false
));
_waiters[generator].WaitOne();
}
}
private
static
void
ItemContainerGeneratorChanged(
object
sender, System.EventArgs e)
{
var generator = sender
as
ItemContainerGenerator;
if
(generator !=
null
&& generator.Status == GeneratorStatus.ContainersGenerated)
{
generator.StatusChanged -= ItemContainerGeneratorChanged;
_waiters[generator].Set();
}
}
private
static
bool
ExpandToObject(ItemsControl control,
object
toFind)
{
bool
retval =
false
;
for
(
int
i = 0; i < control.Items.Count; i++)
{
// Wait for the ContainersGenerated
control.ItemContainerGenerator.CheckContainerGeneratorBuzy();
// Foreach item find container
var visualItem = control.ItemContainerGenerator.ContainerFromIndex(i)
as
RadTreeViewItem;
if
(visualItem !=
null
)
{
if
(!visualItem.IsExpanded)
{
// Expand causes creation of children items
// if not ContainerFromIndex will be null
visualItem.IsExpanded =
true
;
visualItem.UpdateLayout();
}
if
(visualItem.DataContext == toFind)
{
// Verify DataContext of item
retval =
true
;
visualItem.IsExpanded =
false
;
}
if
(!retval)
{
// Recurcivity to children
if
(visualItem.Items.Count > 0)
retval = ExpandToObject(visualItem, toFind);
}
if
(!retval)
// If the branch no contain item, collapse it
visualItem.IsExpanded =
false
;
else
break
;
}
}
return
retval;
}
}
Hope this code help anyone ...
0
Hello JC,
Petar Mladenov
the Telerik team
First of all , accept our apologies for the late response.
I am sending you a possible solution to this issue which uses the the method RadTreeView.ExpandItemByPath() and finds the full path to the selected item recursively.
Please take a look at the attached file and tell me if it satisfies your needs. Feel free to ask if you need further assistance.
Petar Mladenov
the Telerik team
Do you want to have your say when we set our development plans?
Do you want to know when a feature you care about is added or when a bug fixed?
Explore the
Telerik Public Issue Tracking
system and vote to affect the priority of the items