質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

2080閲覧

WPFでのTreeViewへデータバインディング

Hayashi_Jelly

総合スコア26

データバインディング

データソースと、アプリケーションやウェブページ(ウェブアプリケーション)のユーザインタフェースを静的または動的に結合する技術です。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

1グッド

1クリップ

投稿2020/07/22 08:39

編集2020/07/22 09:34

TreeViewへのデータバインディングで躓いております。

お世話になっております。
WPFウィンドウのTreeViewへのデータバインディングについて、
テストとしてインスタンス化時に、データを渡している筈ですが、
全く反映されず、バグ原因も掴めず困っています。

WEBにのっかってるソースそのまま書いたりしても表示されないので、
設定のような部分で間違えているのかもしれませんが・・・
(ソースはC#しかなかったので、.NETの文法に書き換えをしています)

TreeViewコントロールへのDataContextへはきちんと渡したいオブジェクトを渡しているので、近いところにあると思ってはいます。

なぜ表示されないのか、ご助言頂きたいです。

<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:WpfApplication1" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Grid> <TreeView x:Name="TreeView" ItemsSource="{Binding PluginEntries}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Path=Functions}"> <HierarchicalDataTemplate.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Path=Name}"/> </DataTemplate> </HierarchicalDataTemplate.ItemTemplate> <TextBlock Text="{Binding Path=Name}"/> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> </Grid> </Window>

vb

1'Model & ViewModel 2Public Class ViewModel 3 Private _PluginEntries As List(Of Plugin) 4 Public Property PluginEntries As List(Of Plugin) 5 Get 6 Return _PluginEntries 7 End Get 8 Set(value As List(Of Plugin)) 9 _PluginEntries = value 10 End Set 11 End Property 12 13 Sub New() 14 Me.PluginEntries = New List(Of Plugin) 15 Me.PluginEntries.Add(New Plugin With { 16 .Name = "あああ", 17 .Functions = New List(Of Plugin) From { 18 New Plugin With {.Name = "いいい", .Functions = New List(Of Plugin) From { 19 New Plugin With {.Name = "ううう", .Functions = New List(Of Plugin) From { 20 New Plugin With {.Name = "えええ"} 21 }} 22 }} 23 } 24 }) 25 End Sub 26End Class 27 28 29Public Class Plugin 30 Public Name As String 31 Public Functions As List(Of Plugin) 32End Class
TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

len_souko

2020/07/22 09:16

タグにVB.NETを追加してください
guest

回答1

0

ベストアンサー

xamlで"{Binding Path=Name}""{Binding Name}"でも同じ意味)と書いた場合、Nameはプロパティでなければなりません(あとインデクサ)
もしフィールドだった場合、↓のようなエラーが出力ウィンドウに出ているはずです。

BindingExpression path error: 'Name' property not found on 'object' ''Plugin' (HashCode=20917673)'.

データ バインディングの概要 - WPF | Microsoft Docs
バインディング ソースの概要 - WPF | Microsoft Docs

とりあえず期待通りに動かすコードはこうなります。

xml

1<Window 2 x:Class="MainWindow" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 Width="525" 6 Height="350"> 7 <Grid> 8 <TreeView x:Name="TreeView" ItemsSource="{Binding PluginEntries}"> 9 <TreeView.ItemTemplate> 10 <HierarchicalDataTemplate ItemsSource="{Binding Path=Functions}"> 11 <TextBlock Text="{Binding Path=Name}" /> 12 </HierarchicalDataTemplate> 13 </TreeView.ItemTemplate> 14 </TreeView> 15 </Grid> 16</Window>

vb

1Class MainWindow 2 Sub New() 3 Me.DataContext = New ViewModel 4 End Sub 5 6End Class 7 8Public Class ViewModel 9 Private _PluginEntries As List(Of Plugin) 10 Public Property PluginEntries As List(Of Plugin) 11 Get 12 Return _PluginEntries 13 End Get 14 Set(value As List(Of Plugin)) 15 _PluginEntries = value 16 End Set 17 End Property 18 19 Sub New() 20 Me.PluginEntries = New List(Of Plugin) 21 Me.PluginEntries.Add(New Plugin With { 22 .Name = "あああ", 23 .Functions = New List(Of Plugin) From { 24 New Plugin With {.Name = "いいい", .Functions = New List(Of Plugin) From { 25 New Plugin With {.Name = "ううう", .Functions = New List(Of Plugin) From { 26 New Plugin With {.Name = "えええ"} 27 }} 28 }} 29 } 30 }) 31 End Sub 32End Class 33 34Public Class Plugin 35 Private _Name As String 36 Private _Functions As List(Of Plugin) 37 38 Public Property Name As String 39 Get 40 Return _Name 41 End Get 42 Set 43 _Name = Value 44 End Set 45 End Property 46 47 Public Property Functions As List(Of Plugin) 48 Get 49 Return _Functions 50 End Get 51 Set 52 _Functions = Value 53 End Set 54 End Property 55End Class

それとも厳密なMVVMの話なんですかね??

例題としてTreeViewはあんまり向きません(ややこしいので)が、厳密にMVVMするならClass Pluginに対してClass PluginViewModel用意することになります。

TreeView が配置された UI で Model-View-ViewModel パターンを使う方法(VB.NET) - 周回遅れのブルース
上記リンクでいうとDirectoryViewModelPluginViewModelで、DirectoryInfoPluginといった感じですかね?

今回のような単純な例の場合は、モデルを直接ビューに公開することはよくあります。
そのためNameをプロパティにするということになります。

投稿2020/07/22 09:25

編集2023/08/11 09:07
TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hayashi_Jelly

2020/07/22 09:44

ViewModelで公開プロパティにするという意味ですよね? 後で試してみますが、 自分も最初記述はしたのですが、結局そのプロパティに何をセットすればいいかわからず、消してしまいました。 例えば、文字列型のNameプロパティを公開し、インスタンス化時に Me.Name = Me.PluginEntries(index).Name? としたら、「あああ」、「いいい」・・・をどれか一つしか表示できないような気がしたので・・・
TN8001

2020/07/22 09:50

VBは全然わからないので何か変かもしれませんが、回答の2か所を変更し他はそのままで表示されるようになりました。
TN8001

2020/07/22 21:40

全面的に書き直しました。
Hayashi_Jelly

2020/07/24 06:58

ご丁寧に回答していただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問