小弟我被这个SB的WPF treeview 节点重命名,折腾了7个小时,大神们来救救小弟我,指个招, 有关问题简单,附有代码
我被这个SB的WPF treeview 节点重命名,折腾了7个小时,大神们来救救我,指个招, 问题简单,附有代码.
我用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; }
}
}
------解决方案--------------------
要实现INotifyPropertyChanged:
------解决方案--------------------
最好自己写一个 数据管理类,用来管理你的Item类数据,所有的操作都放到这个类里。
在你的 Abb 后代,直接绑定它的 DataContext为你的数据管理类,如: this.DataContext = dataManage;
我用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; }
}
}
------解决方案--------------------
要实现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));
}
}
}
------解决方案--------------------
最好自己写一个 数据管理类,用来管理你的Item类数据,所有的操作都放到这个类里。
在你的 Abb 后代,直接绑定它的 DataContext为你的数据管理类,如: this.DataContext = dataManage;