Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Telerik RadTreeview使用代码选择项目_C#_Silverlight_Radtreeview - Fatal编程技术网

C# Telerik RadTreeview使用代码选择项目

C# Telerik RadTreeview使用代码选择项目,c#,silverlight,radtreeview,C#,Silverlight,Radtreeview,我们在应用程序中使用telerik RadTreeview。我们在代码中使用MVVM模式 长话短说,我需要在我的树状视图中选择一个特定的项目,展开它,然后将该项目滚动到我的视图中。我在viewmodel中设置SelectedReportRoot 我按照下面链接中显示的示例创建了自己的扩展radtreeview 我的问题是性能。这不好。我做了调试,发现找到一个项目需要很多时间,事实上我的IE挂断了。谁能告诉我如何解决这个问题,或者给我一些有用的资源 public class Selectabl

我们在应用程序中使用telerik RadTreeview。我们在代码中使用MVVM模式

长话短说,我需要在我的树状视图中选择一个特定的项目,展开它,然后将该项目滚动到我的视图中。我在viewmodel中设置SelectedReportRoot

我按照下面链接中显示的示例创建了自己的扩展radtreeview

我的问题是性能。这不好。我做了调试,发现找到一个项目需要很多时间,事实上我的IE挂断了。谁能告诉我如何解决这个问题,或者给我一些有用的资源

 public class SelectableRadTreeViewExtended : RadTreeView
  {

    public SelectableRadTreeViewExtended()
      : base()
    {
      this.SelectionChanged += SelectableRadTreeViewExtended_SelectionChanged;
    }

    void SelectableRadTreeViewExtended_SelectionChanged(object sender, Telerik.Windows.Controls.SelectionChangedEventArgs e)
    {
      this.SelectedItem = e.AddedItems[0];
      if (SelectedItem != null)
      {

        this.CustomSelectedItem = this.SelectedItem;
      }
    }

    public object CustomSelectedItem
    {
      get { return (object)GetValue(CustomSelectedItemProperty); }
      set { SetValue(CustomSelectedItemProperty, value); }
    }
    public static readonly DependencyProperty CustomSelectedItemProperty = DependencyProperty.Register("CustomSelectedItem", typeof(object), typeof(SelectableRadTreeViewExtended), new PropertyMetadata(OnCustomSelectionItemChanged));

    private static void OnCustomSelectionItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
      var obj = d as SelectableRadTreeViewExtended;
      if (e.NewValue != null)
      {
        RadTreeViewItem tvi = obj.FindItemNode(e.NewValue);
        if (tvi != null)
        {
          tvi.IsSelected = true;
          obj.GetScrollHost().ScrollIntoView(tvi);
          obj.UpdateLayout();
        }
      }
    }

    public RadTreeViewItem FindItemNode(object item)
    {
      RadTreeViewItem node = null;
      foreach (object data in this.Items)
      {
        node = this.ItemContainerGenerator.ContainerFromItem(data) as RadTreeViewItem;
        if (node != null)
        {
          if (data == item)
            break;
          node = FindItemNodeInChildren(node, item);
          if (node != null)
            break;
        }
      }
      return node;
    }

    protected RadTreeViewItem FindItemNodeInChildren(RadTreeViewItem parent, object item)
    {
      RadTreeViewItem node = null;
      bool isExpanded = parent.IsExpanded;
      if (!isExpanded) //Can't find child container unless the parent node is Expanded once
      {
        parent.IsExpanded = true;
        parent.UpdateLayout();
      }
      foreach (object data in parent.Items)
      {
        node = parent.ItemContainerGenerator.ContainerFromItem(data) as RadTreeViewItem;
        if (data == item && node != null)
          break;
        node = FindItemNodeInChildren(node, item);
        if (node != null)
          break;
      }
      if (node == null && parent.IsExpanded != isExpanded)
        parent.IsExpanded = isExpanded;
      if (node != null)
        parent.IsExpanded = true;
      return node;
    }
  }



<my:SelectableRadTreeViewExtended ItemsSource="{Binding ReportRoots}"
                             SelectionMode="Single"                                 
                             IsEditable="False"
                             Grid.Row="1"
                             HorizontalAlignment="Stretch"
                             VerticalAlignment="Stretch"
                             x:Name="rtvReportRoots"
                             CustomSelectedItem="{Binding SelectedReportRoot, Mode=TwoWay}">
            <my:SelectableRadTreeViewExtended.ItemTemplate>
                <telerik:HierarchicalDataTemplate ItemsSource="{Binding Children}"
                                                  DataType="ViewModels:ReportRootEntityViewModel">
                    <Grid x:Name="NodeContainer"
                          Background="#01000000">
                        <TextBlock Text="{Binding Path=Name}"
                                   Foreground="Gray"
                                   controls:DropZoneHelper.DropZone="NotApplicable" />
                    </Grid>
                </telerik:HierarchicalDataTemplate>

            </my:SelectableRadTreeViewExtended.ItemTemplate>
        </my:SelectableRadTreeViewExtended>
公共类SelectableRadTreeView扩展:RadTreeView
{
public SelectableRadtreeWebExtended()
:base()
{
this.SelectionChanged+=SelectableRadTreeViewExtended\u SelectionChanged;
}
void SelectableRadTreeViewExtended\u SelectionChanged(对象发送方,Telerik.Windows.Controls.selectionchangedventargs e)
{
this.SelectedItem=e.AddedItems[0];
如果(SelectedItem!=null)
{
this.CustomSelectedItem=this.SelectedItem;
}
}
公共对象CustomSelectedItem
{
获取{return(object)GetValue(CustomSelectedItemProperty);}
设置{SetValue(CustomSelectedItemProperty,value);}
}
public static readonly dependencProperty CustomSelectedItemProperty=dependencProperty.Register(“CustomSelectedItem”、typeof(object)、typeof(selectableradtreewextended)、newpropertymetadata(OnCustomSelectionItemChanged));
CustomSelectionItemChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)上的私有静态无效
{
var obj=d作为可选择的RadtreeViewer扩展;
如果(如NewValue!=null)
{
RadTreeViewItem tvi=对象FindItemNode(e.NewValue);
如果(tvi!=null)
{
tvi.IsSelected=true;
obj.GetScrollHost().ScrollIntoView(tvi);
obj.UpdateLayout();
}
}
}
公共RadTreeViewItem FindItemNode(对象项)
{
RadTreeViewItem节点=空;
foreach(此.Items中的对象数据)
{
节点=this.ItemContainerGenerator.ContainerFromItem(数据)作为RadTreeViewItem;
如果(节点!=null)
{
如果(数据==项目)
打破
节点=FindItemNodeInChildren(节点,项);
如果(节点!=null)
打破
}
}
返回节点;
}
受保护的RadTreeViewItem FindItemNodeInChildren(RadTreeViewItem父项,对象项)
{
RadTreeViewItem节点=空;
bool isExpanded=parent.isExpanded;
if(!isExpanded)//除非父节点展开一次,否则找不到子容器
{
parent.IsExpanded=true;
parent.UpdateLayout();
}
foreach(parent.Items中的对象数据)
{
node=parent.ItemContainerGenerator.ContainerFromItem(数据)作为RadTreeViewItem;
如果(数据==项目和节点!=空)
打破
节点=FindItemNodeInChildren(节点,项);
如果(节点!=null)
打破
}
if(node==null&&parent.IsExpanded!=IsExpanded)
parent.IsExpanded=IsExpanded;
如果(节点!=null)
parent.IsExpanded=true;
返回节点;
}
}

我能够解决我的问题。请看下面我所做的。欢迎提出意见和建议以改进我的代码

在我的UI中,我将其添加到UserControl.Resources下

<telerik:ContainerBindingCollection x:Key="BindingCollection">
                <telerik:ContainerBinding PropertyName="IsSelected"
                                          Binding="{Binding IsSelected,Mode=TwoWay}" />
                <telerik:ContainerBinding PropertyName="IsExpanded"
                                          Binding="{Binding IsExpanded, Mode=TwoWay}" />
            </telerik:ContainerBindingCollection>
<telerik:RadTreeView.ItemTemplate>
                <telerik:HierarchicalDataTemplate ItemsSource="{Binding Children}"
                                                  DataType="ViewModels:ReportRootEntityViewModel"
                                                  telerik:ContainerBinding.ContainerBindings="{StaticResource BindingCollection}">
ReportRootEntityViewModel result = GetReportRootNode(Convert.ToInt32(data[0]), reportRoot.Children);
            if (result != null)
            {
              if (_previousSelectedReportRoots != null)
              {
                _previousSelectedReportRoots.Parent.Parent.IsExpanded = false;
                _previousSelectedReportRoots.Parent.IsExpanded = false;
                _previousSelectedReportRoots.IsExpanded = false;

                _previousSelectedReportRoots.IsSelected = false;
              }

              result.Parent.Parent.IsExpanded = true;
              result.Parent.IsExpanded = true;
              result.IsExpanded = true;

              result.IsSelected = true;              
              SelectedReportRoot = result;

              SelectedReportRootDisplayName = data[1];
             DisplayLabel = "Display Name :";
              _previousSelectedReportRoots = SelectedReportRoot;
              return;
            }