1

ツリー ビューのルート項目のいずれかをクリックした場合にのみ、次のバインディング式が 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;
}
4

0 に答える 0