分からないこと
コードが長く申し訳ありませんが、TreeViewの描画についてです。
TreeViewを描画するのみであれば、実現できたのですが(QAその1)、
最終的に、TreeView上の要素を取得したり、ビューからビューモデルの変更をしたかったり
(TreeView上にチェックボックスを表示させ、チェック状態を変更可能にする)
と、要件の実現を考えていく中で、TreeViewItemレベルでモデルを作る方法がネットに載っており、
参考にした方法
それが何をしたいのか、自分でも理解しやすかったため、参考にしました。
要素の取得などする以前に、表示したい文字列RealName
をバインディングすることができていません。
QAその1で、描画のみしたときは、HierarchicalDataTemplate
を使ったせいか、モデルのプロパティで描画できたのですが、
この場合は、どうすればいいのかが分かりません。
VB
1Imports System.ComponentModel 2'------------------------------------------------------------------------- 3' モデルのモデル 4Public Class TreeViewOrigin 5 Private Property _RealName As String 6 Public Property RealName As String 7 Get 8 Return _RealName 9 End Get 10 Set(value As String) 11 _RealName = value 12 End Set 13 End Property 14 15 Private _Children As List(Of TreeViewOrigin) 16 Public Property Children As List(Of TreeViewOrigin) 17 Get 18 Return _Children 19 End Get 20 Set(value As List(Of TreeViewOrigin)) 21 _Children = value 22 End Set 23 End Property 24End Class 25 26'------------------------------------------------------------------------- 27' モデル 28Public Class TreeViewModel2 : Inherits TreeViewItem 29 30 Private _Expand As Boolean 31 32 Private __Origin As TreeViewOrigin 33 Private Property _Origin As TreeViewOrigin 34 Get 35 Return __Origin 36 End Get 37 Set(value As TreeViewOrigin) 38 __Origin = value 39 End Set 40 End Property 41 42 43 Private _RealName As String 44 Public Property RealName As String 45 Get 46 Return Me._RealName 47 End Get 48 Set(value As String) 49 Me._RealName = value 50 End Set 51 End Property 52 53 54 Private _SelectItem As TreeViewModel2 55 Public Property SelectItem As TreeViewModel2 56 Get 57 Return _SelectItem 58 End Get 59 Set(value As TreeViewModel2) 60 _SelectItem = value 61 End Set 62 End Property 63 64 65 '展開時に子要素をすべてインスタンス化 66 Private Sub _ExpandedBehavior(ByVal sender As Object, ByVal e As RoutedEventArgs) 67 If Not Me._Expand Then 68 Me.Items.Clear() 69 For Each c In Me._Origin.Children 70 Me.Items.Add(New TreeViewModel2(c)) 71 Next 72 Me._Expand = True 73 End If 74 End Sub 75 76 77 Private Sub _SelectedBehavior(ByVal sender As Object, ByVal e As RoutedEventArgs) 78 If Me.IsSelected Then 79 Me.SelectItem = Me 80 Else 81 Me.SelectItem = e.Source 82 End If 83 End Sub 84 85 86 Sub New(ByRef tvo As TreeViewOrigin) 87 Me._Expand = False 88 89 Me._Origin = tvo 90 Me.RealName = tvo.RealName 91 92 If tvo.Children IsNot Nothing Then 93 '空のアイテムを追加しておくことで、展開の>が表示される 94 Me.Items.Add(New TreeViewItem()) 95 AddHandler Me.Expanded, AddressOf Me._ExpandedBehavior 96 End If 97 98 AddHandler Me.Selected, AddressOf Me._SelectedBehavior 99 End Sub 100End Class 101 102'------------------------------------------------------------------------- 103' ビューモデル 104Public Class TreeViewViewModel 105 Inherits ViewModel 106 107 108 Private _Model As List(Of TreeViewModel2) 109 Public Property Model As List(Of TreeViewModel2) 110 Get 111 Return _Model 112 End Get 113 Set(value As List(Of TreeViewModel2)) 114 _Model = value 115 End Set 116 End Property 117 118 119 Sub New(ByRef tvm As TreeViewModel2) 120 Me.Model = New List(Of TreeViewModel2) 121 Me.Model.Add(tvm) 122 End Sub 123End Class 124 125'------------------------------------------------------------------------- 126' ビュー 127Public Class MainWin 128 Public Sub New() 129 130 ' この呼び出しはデザイナーで必要です。 131 InitializeComponent() 132 133 ' InitializeComponent() 呼び出しの後で初期化を追加します。 134 135 Dim tvo As New TreeViewOrigin With { 136 .RealName = "hoge", 137 .Children = New List(Of TreeViewOrigin) From { 138 New TreeViewOrigin With { 139 .RealName = "fuga", 140 .Children = New List(Of TreeViewOrigin) From { 141 New TreeViewOrigin With {.RealName = "piyo"} 142 } 143 } 144 } 145 } 146 Dim tvm As New TreeViewModel2(tvo) 147 148 Dim tvvm As New TreeViewViewModel(tvm) 149 Me.TreeView.DataContext = tvvm 150 End Sub 151End Class 152 153
XAML
1<Window x:Class="MainWindow" 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 6 xmlns:local="clr-namespace:WpfApplication1" 7 mc:Ignorable="d" 8 Title="MainWindow" Height="350" Width="525"> 9 <Grid> 10 : 11 (省略) 12 : 13 <TreeView x:Name="TreeView" 14 ItemsSource="{Binding Path=Model}" 15 Grid.ColumnSpan="20" Grid.Column="0" 16 HorizontalAlignment="Stretch" 17 Grid.Row="0" Grid.RowSpan="50" 18 VerticalAlignment="Stretch"> 19 <TreeView.ItemTemplate> 20 <DataTemplate> 21 <TextBlock Text="{Binding Path=RealName}" /> 22 </DataTemplate> 23 </TreeView.ItemTemplate> 24 </TreeView> 25 </Grid> 26</Window>
回答1件
あなたの回答
tips
プレビュー