MVVM
を使用してMVVM
を使用してWPF
アプリケーションにツリービューを構築しようとしていますが、HierarchicalDataTemplate
を処理する方法がわかりません。私のTreeView
は、フォルダ内のフォルダなどを含むフォルダ構造を表す必要があります。次のようにMVAMを使用してTreeViewを構築するXAML定義
マイフォルダViewModel
が定義されています:
public class TreeViewFolderViewModel : ViewModelBase
{
private int _id;
private int _parentId;
private string _text;
private string _key;
private ObservableCollection<TreeViewFolderViewModel> _children;
public int Id
{
get { return this._id; }
set { Set(() => Id, ref this._id, value); }
}
public int ParentId
{
get { return this._parentId; }
set { Set(() => ParentId, ref this._parentId, value); }
}
public string Text
{
get { return this._text; }
set { Set(() => Text, ref this._text, value); }
}
public string Key
{
get { return this._key; }
set { Set(() => Key, ref this._key, value); }
}
public ObservableCollection<TreeViewFolderViewModel> Children
{
get { return this._children ?? (this._children =
new ObservableCollection<TreeViewFolderViewModel>()); }
set { Set(() => Children, ref this._children, value); }
}
}
私のモデルは、最終的なViewModel
は等々子フォルダが含まれているとフォルダのリストである私のViewModel
と同じ構造を有しています。私はすべてのこれらのフォルダをロードするために再帰を使用しており、その部分は正常に動作しています。
私が立ち往生しているところは、このViewModelを定義して実際のTreeViewにロードする方法です。
私はHierarchical DataBinding in TreeView using MVVM patternを読んで、私は、多かれ少なかれ何が起こっているかを理解しながら、私のTreeView
は、1つのオブジェクトのみのタイプを持っていると私はどのようにと混乱している間、TreeView
のレベルのそれぞれが、異なるオブジェクトタイプを表しますこれを定義すると仮定します。
MainWindowViewModelのルートViewModel
プロパティは、タイプTreeViewFolderViewModel
です。つまり、ツリービューのルートを表す単一のオブジェクトを持っています。このオブジェクトは、順番に等々、私はXAML
でこれを定義しない方法
タイプTreeViewFolderViewModel
の子供たちにも持っており、どのタイプTreeViewFolderViewModel
の子供を持っていますか?
<TreeView Grid.Row="1" Margin="5,0,5,5" ItemsSource="{Binding RootFolder}"/>
を私は次のように定義されたテンプレート
Hierarchical
持っている:
<Window.Resources>
<HierarchicalDataTemplate ItemsSource="{Binding Children}"
DataType="{x:Type viewmodels:SharePointFolderTreeViewViewModel}">
<Label Content="{Binding Name}"/>
</HierarchicalDataTemplate>
</Window.Resources>
しかし、何がアップロードされていないが、私は次のように定義されています。
私はこれをどのように解決することができますか?
ありがとうございました。
それはまだ私のために働いていないように私は何かが欠けている必要があります。私のTreeViewのItemSourceは間違いなく正しく設定されています。私は 'HierarchicalDataTemplate'をあなたのものに合わせて変更しました(実際は同じです)。私の最大の間違いは、実際にリスト自体の一部であったはずのノードとしてルートを扱うことでした。私はその部分を修正しました。最終的なリストは、子リストプロパティのルートノードを含むリストであり、これらの子それぞれは独自の子を持っています。唯一の違いは、リストの代わりにObservableCollectionを使用していることです。何か案は?ありがとう。 – Thierry
出力ウィンドウに次のエラーが表示されています。 System.Windows.Dataエラー:40:BindingExpressionパスエラー: 'Children'プロパティが 'object'に見つかりません 'ObservableCollection'1'(HashCode = 51831188) ' BindingExpression:Path = Folders。子供; DataItem = 'ChooseFolderDialogViewModel'(HashCode = 9691954);ターゲット要素は 'TreeView'(Name = '')です。ターゲットプロパティは 'ItemsSource'(タイプ 'IEnumerable')です。それは明らかに私のツリービューがまだ空である理由です。私は何かを見つけたらそれを調べて更新し続けます。 – Thierry
私の問題が見つかりました。 'ItemsSource =" {Binding Folders} "と思っていたとき、私は愚かに' ItemsSource = "{Binding Folders.Children}"を残しました。期待通りにすべてが読み込まれています。要するに、フォルダのリストの子としてルートを追加する必要があります。もう一度多くの感謝! – Thierry