lightswitch 添加 TreeView 控件
时间:2022-05-08
本文章向大家介绍lightswitch 添加 TreeView 控件,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
代码片段
<UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="LightSwitchApplication.TreeViewControl.DepartmentTreeViewControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:LightSwitchApplication.TreeViewControl"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<UserControl.Resources>
<local:EntityCollectionValueConverter x:Key="EntityCollectionValueConverter" />
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="White">
<StackPanel Orientation="Horizontal">
<sdk:TreeView Name="treeViewControl" SelectedItemChanged="treeViewControl_SelectedItemChanged" ItemsSource="{Binding Screen.DepartmentTree}">
<sdk:TreeView.ItemTemplate>
<sdk:HierarchicalDataTemplate
ItemsSource="{Binding
Converter={StaticResource EntityCollectionValueConverter},
ConverterParameter=Children}">
<StackPanel Orientation="Horizontal">
<!--<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}"/>-->
<TextBlock Text="{Binding Path=Name, Mode=TwoWay}"
Margin="5,0" Width="74" />
</StackPanel>
</sdk:HierarchicalDataTemplate>
</sdk:TreeView.ItemTemplate>
</sdk:TreeView>
</StackPanel>
</Grid>
</UserControl>
using Microsoft.LightSwitch.Framework.Client;
using Microsoft.LightSwitch.Presentation;
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;
namespace LightSwitchApplication.TreeViewControl
{
public partial class DepartmentTreeViewControl : UserControl
{
public DepartmentTreeViewControl()
{
InitializeComponent();
}
private void treeViewControl_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
var selectItem = (LightSwitchApplication.Department)treeViewControl.SelectedItem;
var type1 = selectItem.GetType();
var context = (IContentItem)this.DataContext;
var screen = context.Screen;
var data = (VisualCollection<LightSwitchApplication.Department>)screen.Details.Properties["DepartmentTree"].Value;
data.SelectedItem = selectItem;
//data.text= selectItem.Details.Properties["Id"].Value;
}
}
}
using Microsoft.LightSwitch;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
namespace LightSwitchApplication.TreeViewControl
{
public class EntityCollectionValueConverter : IValueConverter
{
public object Convert(object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
string strErrorMessage
= "Converter parameter should be set to the property name that will serve as source of data";
IEntityObject entity = value as IEntityObject;
if (entity == null)
throw new ArgumentException("The converter should be using an entity object");
string sourcePropertyName = parameter as string;
if (string.IsNullOrWhiteSpace(sourcePropertyName))
throw new ArgumentException(strErrorMessage);
// Enumerate the source property using logic dispatcher
// and prepare the collection of entities that the control will bind to
var entities = new ObservableCollection<IEntityObject>();
var temporaryEntites = new List<IEntityObject>();
entity.Details.Dispatcher.BeginInvoke(delegate
{
IEntityCollection eCollection =
entity.Details.Properties[sourcePropertyName].Value as IEntityCollection;
if (eCollection == null)
{
Debug.Assert(false, "The property " + sourcePropertyName + " is not an entity collection");
return;
}
// Now we are on the logic thread. We cannot just stuff the observable collection
// with entities because the collection will immediately raise Changed events
// and this will result in invalid cross-thread access. So we'll use a temporary collection
// and copy the entites again on the UI thread
foreach (IEntityObject e in eCollection)
{
temporaryEntites.Add(e);
}
Microsoft.LightSwitch.Threading.Dispatchers.Main.BeginInvoke(delegate
{
// I wish ObservableCollection had an AddRange() method...
foreach (IEntityObject e in temporaryEntites)
{
entities.Add(e);
}
});
});
return entities;
}
public object ConvertBack(object value,
Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
片段2
public partial class CategoriesListDetail
{
private TreeView treeView = null;
partial void CategoriesListDetail_InitializeDataWorkspace(List<IDataService> saveChangesTo)
{
// Write your code here.
}
partial void CategoriesListDetail_Created()
{
// Write your code here.
this.P_Name = "";
this.RootNode.Load();
this.FindControl("TreeViewControl").ControlAvailable += ((o, e) =>
{
treeView = e.Control as TreeView;
treeView.BorderThickness = new Thickness(1);
if (treeView.Items.Count == 0)
{
foreach (var item in this.RootNode)
{
TreeViewItem rootItem = new TreeViewItem() { Header = item.Name, Tag = item.Id };
treeView.Items.Add(rootItem);
}
treeView.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(TreeViewItem_SelectedItemChanged);
}
});
}
private void TreeViewItem_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
var parentItem = e.NewValue as TreeViewItem;
this.P_Name = (string)parentItem.Header;
this.p_id = (int)parentItem.Tag;
///when collection is refreshed the event SelectedNodeEmployees_Changed is hooked up
///do not use Load method to avoid caching
this.SelectedChildrenNodes.Refresh();
}
partial void SelectedChildrenNodes_Changed(NotifyCollectionChangedEventArgs e)
{
if (treeView != null)
{
Dispatchers.Main.BeginInvoke(() =>
{
var parentItem = treeView.SelectedItem as TreeViewItem;
if (parentItem != null)
{
if (parentItem.Items.Count == 0 && this.SelectedChildrenNodes.Count() > 0)
{
foreach (var item in this.SelectedChildrenNodes) //.Where(act => act.Title != "???")
{
TreeViewItem newChildItem = new TreeViewItem() { Header = item.Name, Tag = item.Id };
parentItem.Items.Add(newChildItem);
}
}
}
});
}
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- meterpreter shell | 加固shell
- R语言绘图:复杂散点图绘制
- windows下部署sentinel模式的Redis主从集群
- tmux | 加固shell
- Windows下离线部署Redis主从集群
- SSH 后门 | Nmap 脚本
- 【Tomcat源码解析】第二章:不用死记硬背记住Tomcat整体架构
- 计划任务后门 | Linux 后门系列
- alias后门 | Linux 后门系列
- vim 后门 | Linux 后门系列
- 个站建设基础教程
- 【Tomcat源码解析】第一章:如何搭建源码阅读环境
- LD_PRELOAD 后门 | Linux 后门系列
- 如何利用k8s拉取私有仓库镜像
- rsyslog queue队列权威指南