1

同様の回答を閲覧しましたが、問題が見つかりません。

私は 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>

ありがとうございました!

4

2 に答える 2

1

アンドリュー、

交換してみてください

    Task.Run(() =>
    {
        TopFurnitureNodes.Add(new FurnitureTreeNode("Beds", null, null);
    }
    );

と:

TopFurnitureNodes.Add(new FurnitureTreeNode("Beds", null, null);

そして、これが役立つことをお知らせください。

また、ViewModel を View に正しくバインドしていることも確認してください。

于 2013-09-12T09:52:14.280 に答える
0

INotifyPropertyChangedビューモデルにインターフェイスを実装し、更新時にパラメーター値でPropertyChangedイベントを発生させてみてください。PropertyNameTopFurnitureNodes

Task.Run(() =>
{
    TopFurnitureNodes.Add(new FurnitureTreeNode("Beds", null, null);
    RaisePropertyChanged("TopFurnitureNodes");
});

これを実際に行う必要はありませんが、機能するはずです。

于 2013-09-12T09:34:02.790 に答える