Silverlight 树形控件用法数据绑定、右键菜单

1、树形控件定义如下:

        <controls:TreeView x:Name="MainTree" ItemsSource="{Binding ItemsRoot}" MouseRightButtonDown="MainTree_MouseRightButtonDown" >
            <controls:TreeView.ItemTemplate>
                <common:HierarchicalDataTemplate ItemsSource="{Binding TemplateItems}">
                    <StackPanel Orientation="Horizontal">
                        <Image Width="15" Height="15" Source="{Binding ImageUri}"/>
                        <HyperlinkButton x:Name="TemplateLinkButton" Content="{Binding displayName}" Click="TemplateLinkButton_Clicked"/>
                        <TextBox Text="{Binding displayName,Mode=TwoWay}" Visibility="Collapsed" LostFocus="TextBox_LostFocus"/>
                    </StackPanel>
                </common:HierarchicalDataTemplate>
            </controls:TreeView.ItemTemplate>
        </controls:TreeView>

2、数据绑定:通过ItemsSource进行数据绑定,绑定到ObservableCollection,在viewmodel层中实现如下:

public class TemplateTreeviewmodel : INotifyPropertyChanged
    {
        private static TemplateTreeviewmodel instance = new TemplateTreeviewmodel();
        private TemplateItem rootItem = new TemplateItem();
        private ObservableCollection<TemplateItem> itemsRoot = new ObservableCollection<TemplateItem>();

        public static TemplateTreeviewmodel Instance { get { return instance; } }

        public ObservableCollection<TemplateItem> ItemsRoot
        {
            get { return itemsRoot; }
            set
            {
                itemsRoot = value;
                NotifyPropertyChanged("ItemsRoot");
            }
        }

        private TemplateTreeviewmodel()
        {
            rootItem = new TemplateItem() { displayName = "模板列表",Istemplate = false };
            ItemsRoot.Add(rootItem);
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this,new PropertyChangedEventArgs(propertyName));
            }
        }
    }

3、右键菜单的定义:通过MouseRightButtonClick来定义: namespace Controls {     /// <summary>     /// Interaction logic for TemplateTreeView.xaml     /// </summary>     public partial class TemplateTreeView : UserControl     {         private ContextMenu folderMenu = new ContextMenu();         private ContextMenu templateMenu = new ContextMenu();         private TextBlock currentTextBlock = null;         private TextBox currentTextBox = null;         private TemplateItem currentContext = null;         public event EventHandler<TemplateSelectedEventArgs> TemplateSelected = null;         public TemplateTreeView()         {             InitializeComponent();             this.DataContext = TemplateTreeviewmodel.Instance;             MenuItem addFolderItem = new MenuItem();             addFolderItem.Header = "创建文件夹";             addFolderItem.Foreground = new SolidColorBrush(Colors.Black);             addFolderItem.Click += new RoutedEventHandler(addFolderItem_Click);             MenuItem addTemplateItem = new MenuItem();             addTemplateItem.Header = "添加模板";             addTemplateItem.Foreground = new SolidColorBrush(Colors.Black);             addTemplateItem.Click += new RoutedEventHandler(addTemplateItem_Click);             MenuItem renameItem = new MenuItem();             renameItem.Header = "重命名";             renameItem.Foreground = new SolidColorBrush(Colors.Black);             renameItem.Click += new RoutedEventHandler(renameItem_Click);             folderMenu.Items.Add(addFolderItem);             folderMenu.Items.Add(addTemplateItem);             folderMenu.Items.Add(renameItem);             MenuItem renameItem2 = new MenuItem();             renameItem2.Header = "重命名";             renameItem2.Foreground = new SolidColorBrush(Colors.Black);             renameItem2.Click += new RoutedEventHandler(renameItem_Click);             templateMenu.Items.Add(renameItem2);         }         void renameItem_Click(object sender,RoutedEventArgs e)         {             if (currentTextBlock != null)             {                 TextBox textBox = (currentTextBlock.Parent as StackPanel).Children[2] as TextBox;                 currentTextBox = textBox;                 currentTextBlock.Visibility = System.Windows.Visibility.Collapsed;                 textBox.Visibility = System.Windows.Visibility.Visible;                 textBox.Focus();                 textBox.SelectAll();             }         }         void addTemplateItem_Click(object sender,RoutedEventArgs e)         {             if (currentContext != null)             {                 OpenTemplateWindow openTemplateWindow = openTemplateWindow = new OpenTemplateWindow(); #if !SILVERLIGHT                 openTemplateWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;                 var dialogResult = openTemplateWindow.ShowDialog();                 if (dialogResult ?? false)                 {                     currentContext.TemplateItems.Add(new TemplateItem()                     {                         displayName = openTemplateWindow.TemplateName,                        TemplateName = openTemplateWindow.TemplateName,                        Istemplate = true                     });                 } #else                 openTemplateWindow.Closed += (sender2,e2) =>                 {                     currentContext.TemplateItems.Add(new TemplateItem()                         {                             displayName = openTemplateWindow.TemplateName,                            TemplateName = openTemplateWindow.TemplateName,                            Istemplate = true                         });                 };                 openTemplateWindow.Show(); #endif             }         }         void addFolderItem_Click(object sender,RoutedEventArgs e)         {             if (currentContext != null)             {                 currentContext.TemplateItems.Add(new TemplateItem() { displayName = "我的模板",Istemplate = false });             }         }         public TemplateTreeviewmodel viewmodel         {             get { return this.DataContext as TemplateTreeviewmodel; }         }         private void MainTree_MouseRightButtonDown(object sender,MouseButtonEventArgs e)         {             var textBlock = e.OriginalSource as TextBlock;             if (textBlock != null)             {                 currentTextBlock = textBlock;                 var item = textBlock.DataContext as TemplateItem;                 if (item != null)                 {                     currentContext = item;                     if (!item.Istemplate)                         folderMenu.IsOpen = true;                     else                         templateMenu.IsOpen = true;                 }             }         }         private void TextBox_LostFocus(object sender,RoutedEventArgs e)         {             currentTextBlock.Visibility = System.Windows.Visibility.Visible;             currentTextBox.Visibility = System.Windows.Visibility.Collapsed;         }         private void MainTree_MouseDoubleClick(object sender,RoutedEventArgs e)         {             var textBlock = e.OriginalSource as TextBlock;             if (textBlock != null)             {                 currentTextBlock = textBlock;                 var item = textBlock.DataContext as TemplateItem;                 if (item != null)                 {                     currentContext = item;                     if (item.Istemplate)                     {                         if (TemplateSelected != null)                             TemplateSelected(this,new TemplateSelectedEventArgs() { TemplateName = item.TemplateName });                     }                 }             }         } #if SILVERLIGHT                 private void TemplateLinkButton_Clicked(object sender,RoutedEventArgs e)                 {                     var hyperlink = sender as HyperlinkButton;                     if (hyperlink != null)                     {                         var item = hyperlink.DataContext as TemplateItem;                         if (item != null)                         {                             currentContext = item;                             if (item.Istemplate)                             {                                 if (TemplateSelected != null)                                     TemplateSelected(this,new TemplateSelectedEventArgs() { TemplateName = item.TemplateName });                             }                         }                     }                 } #endif     } }

相关文章

如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的...
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,...
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如...
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不...
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:...
我需要根据Silverlight中的某些配置值设置给定控件的Style.我...