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); } } } }); } } }