我被这个SB的WPF treeview 节点重命名,折腾了7个小时,大神们来救救我,指个招, 问题简单,附有代码.

Ptrtoptr 2014-06-24 11:02:46
我用TreeView 绑定了 ObservableCollection集合做数据源.
//按说ObservableCollection集合, 数据更新,界面也应该同步,
但是界面没有变化. 代码如下:


<TreeView x:Name="tv" SelectedItemChanged="SelectedItemChanged">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Items}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ContextMenu>
<ContextMenu >
<MenuItem Header="重命名" Name="rename" Click="rename_Click"></MenuItem>
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
/////
public partial class Abb : Window {
public Abb() {
InitializeComponent();
Item item = new Item() { Name = "parent" , Items= new ObservableCollection<Item>()};
item.Items.Add(new Item(){Name="child1"});
item.Items.Add(new Item(){Name="child2"});
ObservableCollection<Item> list = new ObservableCollection<Item>();
list.Add(item);
tv.ItemsSource = list;
}
private void rename_Click(object sender, RoutedEventArgs e) {
Item item = tv.SelectedItem as Item;
item.Name = "new Name";
//按说是ObservableCollection集合, 这里的数据更新,界面也应该同步,但是界面没有变化
//请问怎么处理能让界面同步更新,
//我试过tv.items.Refresh() ,它可以让界面同步,不过它会把整个树都折叠起来,并且没有了SelectedItem.
//请问还有什么办法能让界面同更新
}
public class Item {
public string Name { get; set; }
public ObservableCollection<Item> Items { get; set; }
}
}
...全文
119 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
exception92 2014-06-25
  • 打赏
  • 举报
回复
最好自己写一个 数据管理类,用来管理你的Item类数据,所有的操作都放到这个类里。 在你的 Abb 后代,直接绑定它的 DataContext为你的数据管理类,如: this.DataContext = dataManage; 然后再xaml上直接使用bind 来绑定你的数据集合。注意,你的 ObservableCollection集合也要 FirePropertyChangedEvent一下。
gomoku 2014-06-25
  • 打赏
  • 举报
回复
要实现INotifyPropertyChanged:

public class Item : INotifyPropertyChanged
{
    string name;
    public string Name 
    { 
        get { return name;}
        set { name = value; FirePropertyChangedEvent("Name"); }
    }
    public ObservableCollection<Item> Items { get; set; }



    public event PropertyChangedEventHandler PropertyChanged;
    private void FirePropertyChangedEvent(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
}
在Windows系统中,notepad.exe(记事本)是一个“经典的”、“简洁的”文本编辑器。这个软件,没有华丽的外观,也没有繁杂的功能,仅仅是一个文本编辑小软件。虽然经过Windows系统数十年的变换,但它却保持着永恒姿态,数十年来几乎不曾改变过。曾经,VS中的经典DEMO中,就有它的身影,一个新建的项目,就藏有一个新建的“记事本”。然而,在WPF的项目中,“记事本”却消失的无影无踪,也许是很容易实现,也许是为了革新,而不愿再传承“经典”。确实,使用WPF技术再次让“记事本”复活,确实也是一件非常容易的事情。但是,如果,使用WPF技术,再搭配当下非常流行的MVVM模式呢?复活“记事本”的难度却陡然上升至很多WPF程序员为之默默叹气。而,MVVM模式是掌握WPF的最顶级技术,MVVM模式拥有的无尽的优势,让WPF相对于过往的编程模式来说,是一种革命性的创新,从而也成为大中型WPF项目中必须的模式。但,学习难度。。。。。。在这个《WPF记事本开发详解》的课程中,赵老师带领你在WPF中,从零开始一步步构建MVVM模式,直到让你亲自以WPF+MVVM的方式,让这个经典的“记事本”软件从你的手中“复活”。在课程中,赵老师会详细讲解WPF和MVVM中的各种技巧,让你从此爱上WPF+MVVM编程。

110,533

社区成员

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

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

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