代码片段
<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 tovar 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 threadforeach (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 cachingthis.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);}}}});}}}