如何使telerik radTreeListView只允许选择同一个rootItem / ParentItem下的项?
UK
-london
-london 1
-london --
-london 100
-Newcastle
-Newcastle 1
-Newcastle 2
-Newcastle 3
-liverpool
USA
-New york
-califonia
China
-one
-two
从radTreeListView的上面示例菜单中,应该允许用户只选择
英国,美国或中国。 或 伦敦,纽卡斯尔,利物浦, OR 纽卡斯尔1,纽卡斯尔2,纽卡斯尔3 但不纽卡斯尔1,伦敦1,英国也不英国,纽卡斯尔,纽卡斯尔1。
用户只应选择同一层次结构中的内容/项目。基本上,他们不应该选择父母和孩子,他们要么选择父母,要么选择子女或子女。
这是我使用的控件:http://www.telerik.com/help/silverlight/radtreelistview-overview.html
答案 0 :(得分:1)
那么,如果您在课堂上填充数据并为每个数据设置父级,您可以检查谁是所选节点的父级,那么您应该manually
执行此操作!
现在如何填充数据?
尝试更常见的方法,并在Telerik网站上提供样本!
我尝试下面的示例数据,并尝试使用SO来学习新东西。
创建一个包含父
的类请参阅此课程:
public class Category
{
public string Name { get; set; }
public Category Parent { get; set; }
public ObservableCollection<Category> Items{get;set;}
//Constructor
public Category(string Cat_name, Category Cat_parent)
{
Name = Cat_name;
Parent = Cat_parent;
Items = new ObservableCollection<Category>();
}
/// <summary>
/// Adds a child to this node
/// </summary>
/// <param name="child"></param>
/// <returns></returns>
public void AddChild(Category child)
{
if (child == null) //check if the child is not null
return;
Items.Add(child);
}
/// <summary>
/// Returns Root Parent
/// </summary>
/// <returns></returns>
public Category RootPanel()
{
if (Parent == null)
{
return this;
}
else
{
return this.Parent.RootPanel();
}
}
}
现在我尝试生成您的样本数据“UK-USA-China”
这是生成样本数据的代码
public static ObservableCollection<Category> GetCategoryData()
{
ObservableCollection<Category> data = new ObservableCollection<Category>();
Category UK = new Category("UK", null);//Because it's root panel it has no parents so parent should set to null
//Adding sub category of UK
Category London = new Category("London", UK);
UK.AddChild(London);
Category NewCastel = new Category("NewCastel", UK);
UK.AddChild(NewCastel);
Category LiverPool = new Category("LiverPool", UK);
UK.AddChild(LiverPool);
//adding childs of London and Newcastle
for (int i = 1; i <= 100; i++)
{
London.AddChild(new Category("london " + i.ToString(), London));
}
NewCastel.AddChild(new Category("NewCastle 1", NewCastel));
NewCastel.AddChild(new Category("NewCastle 2", NewCastel));
NewCastel.AddChild(new Category("NewCastle 3", NewCastel));
data.Add(UK);
Category USA = new Category("USA", null);
USA.AddChild(new Category("NewYork", USA));
USA.AddChild(new Category("California", USA));
data.Add(USA);
Category China = new Category("China", null);
China.AddChild(new Category("one", China));
China.AddChild(new Category("two", China));
China.AddChild(new Category("three", China));
data.Add(China);
return data;
}
在按钮后面,我将您的数据设置为RadTreeListView
private void button1_Click(object sender, RoutedEventArgs e)
{
radTreeListView.ItemsSource = GetCategoryData();
}
现在是时候回复您的请求了! 检查父母:
private void radTreeListView_SelectionChanging(object sender, Telerik.Windows.Controls.SelectionChangingEventArgs e)
{
if (e.AddedItems.Count>0)
{
if (radTreeListView.SelectedItems.Count >= 5)
{
e.Cancel = true;
}
if (radTreeListView.SelectedItems.Count>=1) // a node has been selected before
{
//
Category PreviousSelectedItem = (Category)radTreeListView.SelectedItems[0];
Category ItemWhichisSelectedNow = (Category)e.AddedItems[0];
if (PreviousSelectedItem.Parent != ItemWhichisSelectedNow.Parent)
{
e.Cancel = true;
}
}
}
}