[求助]wpf中TreeView的显示问题

h82258652 2013-07-23 05:32:29
想做一个基于WPF的目录树
具体的效果是这样的

每个TreeViewItem显示文件夹
分别显示图标、文件夹名称和当前文件夹的子文件夹个数

现在问题就是第三项显示“当前文件夹的子文件夹个数”这一项总是为0。(调试有数值,但界面显示0)
前台代码
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TreeView>
<loc:MyTreeViewItem x:Name="MyFiles">
<loc:MyTreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Source="/WpfApplication2;component/Images/Folder.png" />
<TextBlock Text="我的文件"></TextBlock>
<TextBlock Text="{Binding Count}" Margin="5,0,0,0"></TextBlock>
</StackPanel>
</loc:MyTreeViewItem.Header>
<loc:MyTreeViewItem>
<loc:MyTreeViewItem.Header>
<StackPanel Orientation="Horizontal">
<Image Width="16" Height="16" Source="/WpfApplication2;component/Images/Folder.png" />
<TextBlock Text="我的文件的文件"></TextBlock>
<TextBlock Text="{Binding Count}" Margin="5,0,0,0"></TextBlock>
</StackPanel>
</loc:MyTreeViewItem.Header>
</loc:MyTreeViewItem>
</loc:MyTreeViewItem>
</TreeView>
</Grid>
</Window>


后台TreeViewItem.cs代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Controls;

namespace WpfApplication2
{
class MyTreeViewItem:TreeViewItem
{
public int Count
{
get
{
return this.Items.Count;
}
}

public MyTreeViewItem()
{
this.DataContext = this;
}
}
}


由于Count属性是只读的,因此INotifyPropertyChanged接口也用不上了。
求cdsn的大牛指导。

另外我将TreeViewItem封装成UserControl再添加到的话,在TreeView中就没法选中封装好的UserControl(也就是没法选中然后背景变蓝),求大牛指导指导。
...全文
289 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2013-07-23
  • 打赏
  • 举报
回复
这里正好有人给了一份ScrollBar的控件模板,自己看了就应该明白如何修改已有控件的模板样式了吧,不需要使用UserControl,http://my.csdn.net/u011485117/code/detail/58111
qldsrx 2013-07-23
  • 打赏
  • 举报
回复
为你的MyTreeViewItem单独定义xaml即可,效果和封装一个UserControl是一样的,UserControl支持可视化设计,而直接添加xaml样式文件就没有可视化设计了,你可以先设计好了复制出来使用,基本代码如下:
<Style TargetType="MyTreeViewItem">
    <Setter Property="Template">
    </Setter>
</Style>
h82258652 2013-07-23
  • 打赏
  • 举报
回复
引用 3 楼 qldsrx 的回复:
UserControl是继承System.Windows.Controls.ContentControl,而TreeViewItem是继承System.Windows.Controls.ItemsControl,这两者不相干,因此你不能封装到UserControl中。 目前我看你继承TreeViewItem来实现不是也没问题吗?添加动态生成文件夹的代码在内部也是可以的。
主要是现在图标和文本的布局都写在了主界面的xaml,动态生成的话就不清楚怎么弄了。 现在只能在构造函数里new一个StackPanel然后添加图标和文本控件,然后设置Header为StackPanel。最后暴露图标和文本控件的属性。麻烦大牛想想还有什么办法吧。没有的话我9点结贴好了。反正基本都实现了,只是有点麻烦。 顺便谢谢大牛了。
qldsrx 2013-07-23
  • 打赏
  • 举报
回复
UserControl是继承System.Windows.Controls.ContentControl,而TreeViewItem是继承System.Windows.Controls.ItemsControl,这两者不相干,因此你不能封装到UserControl中。 目前我看你继承TreeViewItem来实现不是也没问题吗?添加动态生成文件夹的代码在内部也是可以的。
h82258652 2013-07-23
  • 打赏
  • 举报
回复
引用 1 楼 qldsrx 的回复:
INotifyPropertyChanged接口不一定要用在对应的属性上面,只要在合适的时候触发它即可。 例如:

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
上面的是基本定义,然后你在添加子项时调用OnPropertyChanged("Count")方法即可,如果你可以确定是哪个方法添加的子项,并且那个方法能被override,那么直接在该方法内调用OnPropertyChanged("Count")方法即可,那样就不需要设置为public了。
谢谢大牛,重载OnItemsChanged后可以实现了。那么有办法用UserControl之类的方法封装这个TreeViewItem吗?毕竟文件夹都是动态生成的。但是将其包含在UserControl则没法选中。
qldsrx 2013-07-23
  • 打赏
  • 举报
回复
INotifyPropertyChanged接口不一定要用在对应的属性上面,只要在合适的时候触发它即可。 例如:

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = this.PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
上面的是基本定义,然后你在添加子项时调用OnPropertyChanged("Count")方法即可,如果你可以确定是哪个方法添加的子项,并且那个方法能被override,那么直接在该方法内调用OnPropertyChanged("Count")方法即可,那样就不需要设置为public了。

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧