ツリー ビューのルート項目のいずれかをクリックした場合にのみ、次のバインディング式が TreeView コントロールからスローされます。他の項目をクリックすると、クリックするまでバインディング式は表示されません。 root Item の場合、バインド例外が常に表示されます。
バインディング式のパスに先頭がありません。'Asset' と 'Trade' は Node クラスの Name プロパティの値であり、階層データ構造であり、Node 型の子コレクションなどがあります...
アイテムは、ListCollectionView を使用して TreeView にバインドされます。
Win7 で実行される .Net 4.0 WPF アプリ。
TreeView にバインドされたクラスは次のとおりです。
internal class Node : INotifyPropertyChanged
{
public string Id { get; private set; }
public string Name { get; private set; }
public Node Parent { get; private set; }
public IEnumerable<Node> Children { get; private set; }
}
なぜこれが起こっているのですか?
System.Windows.Data エラー: 40: BindingExpression パス エラー: 'Asset' プロパティが 'object' ''Node' (HashCode=-729436854)' に見つかりません。BindingExpression:Path=Asset; DataItem='Node' (HashCode=-729436854); ターゲット要素は 'TreeView' (Name='FieldTreeView') です。ターゲット プロパティは 'NoTarget' (タイプ 'Object') です
System.Windows.Data エラー: 40: BindingExpression パス エラー: 'Trade' プロパティが 'object' ''Node' (HashCode=-729436854)' に見つかりません。BindingExpression:Path=トレード; DataItem='Node' (HashCode=-729436854); ターゲット要素は 'TreeView' (Name='FieldTreeView') です。ターゲット プロパティは 'NoTarget' (タイプ 'Object') です
これは TreeView の XAML で、WPF ユーザー コントロールの一部として使用されます。
<TreeView Name="FieldTreeView"
Grid.Row="1"
Margin="0,15,0,0"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.VirtualizationMode="Recycling"
SelectedItemChanged="FieldTreeViewOnSelectedItemChanged">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=Children, Mode=OneWay}">
<Grid>
<TextBlock Text="{Binding Path=Name, Mode=OneWay}" />
<Grid.ContextMenu>
<ContextMenu ItemsSource="{Binding Path=FieldMenu, Mode=OneWay}"
DisplayMemberPath="Title"
Visibility="{Binding Path=HasFieldMenu, Mode=OneWay, Converter={StaticResource BooleanToVisibilityConverter}}">
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command" Value="{Binding}" />
<Setter Property="CommandParameter"
Value="{Binding Path=DataContext.Id, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}" />
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
</Grid.ContextMenu>
</Grid>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsItemsHost="True" />
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
<EventSetter Event="MouseDoubleClick" Handler="FilterTreeViewOnItemMouseDoubleClick" />
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
Node クラスの設定に使用されるコードを以下に示します。
private void InitialiseFields()
{
_rootNode.RemoveAllChildren();
foreach (var field in _fields.OrderBy(x => x.Id))
{
NodeHelper.TokenizeIntoNodes(field, field.Id.Split(Node.IdSeperator), _menuMediator, _rootNode);
}
_nodes = _rootNode.Children.Cast<Node>().ToArray();
FieldTreeView.ItemsSource = _rootNode.Children;
}