已经浏览过类似的答案,但我就是找不到问题。
我正在使用MvvmLight,并将WPF TreeView绑定到ViewModel中的ObservableCollection。树显示得很好,但是如果稍后将成员添加到ObservableCollection中,树就不会刷新。
下面是代码:
// the data type that represents a tree node
public class FurnitureTreeNode : GalaSoft.MvvmLight.ViewModelBase
{
public string Name { get; private set; }
public object Data { get; private set; }
public ObservableCollection<FurnitureTreeNode> ChildNodes { get; set;}
public Furniture(string Name, ObservableCollection<FurnitureTreeNode> ChildNodes, object Data)
{
this.Name = Name;
this.ChildNodes = ChildNodes;
this.Data = Data;
}
}
public class FurnituresViewModel : GalaSoft.MvvmLight.ViewModelBase
{
public ObservableCollection<FurnitureTreeNode> TopFurnitureNodes { get; set; }
public ObservableCollection<FurnitureTreeNode> ChairNodes { get; set; }
public FurnituresViewModel()
{
// initialize the top level furnitures collection
TopFurnitureNodes = new ObservableCollection<FurnitureTreeNode>();
// add two children
TopFurnitureNodes.Add(new FurnitureTreeNode("Tables", null, null);
TopFurnitureNodes.Add(new FurnitureTreeNode("Chairs", null, null);
// add Beds only when they're ready
BedsManager.ImportsSatisfied += AddBedsNode;
}
下面的代码运行良好,集合将使用Beds节点进行更新,但它没有反映在TreeView中:
void AddBedsNode( object sender, EventArgs e )
{
Task.Run(() =>
{
TopFurnitureNodes.Add(new FurnitureTreeNode("Beds", null, null);
}
);
}
}
以下是XAML:
<TreeView Name="FurnituresTreeView" ItemsSource="{Binding TopFurnitureNodes}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=ChildNodes}" DataType="x:Type FurnitureTreeNode">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
谢谢!
发布于 2013-09-12 01:52:14
安德鲁,
请试着替换
Task.Run(() =>
{
TopFurnitureNodes.Add(new FurnitureTreeNode("Beds", null, null);
}
);
通过以下方式:
TopFurnitureNodes.Add(new FurnitureTreeNode("Beds", null, null);
让我们知道这有帮助。
还请确保您将ViewModel绑定到正确的视图。
发布于 2013-09-12 01:34:02
尝试在视图模型中实现INotifyPropertyChanged
接口,并在更新时使用PropertyName
参数值TopFurnitureNodes
引发PropertyChanged
事件:
Task.Run(() =>
{
TopFurnitureNodes.Add(new FurnitureTreeNode("Beds", null, null);
RaisePropertyChanged("TopFurnitureNodes");
});
你不应该真的这么做,但它应该是有效的。
https://stackoverflow.com/questions/18760321
复制相似问题