F.P
F.P

Reputation: 17831

TreeView with DataBinding

I want to create a databinding on a TreeView with the following model:

public partial class MainWindow : Window
{
    private ViewModel model = new ViewModel();

    public MainWindow()
    {
        InitializeComponent();
        DataContext = model;
    }
    ...
}

public class ViewModel : ObservableObject
{
    private IList<Document> sourceDocuments;

    public IList<Document> SourceDocuments
    {
        get { return sourceDocuments; }
        set
        {
            sourceDocuments = value;
            OnPropertyChanged("SourceDocuments");
        }
    }

    public ViewModel()
    {
        SourceDocuments = new ObservableCollection<Document>();
    }
}

public class Document
{
    public String Filename;
    public IList<DocumentBlock> Blocks { get; set; }

    public Document(String filename)
    {
        this.Filename = filename;
        Blocks = new List<DocumentBlock>();
    }
}

public class DocumentBlock
{
    public String Name { get; private set; }

    public DocumentBlock(String name)
    {
        this.Name = name;
    }

    public override string ToString()
    {
        return Name;
    }
}

And this XAML

 <TreeView HorizontalAlignment="Left" Margin="6,6,0,6" Name="SourceDocumentsList" Width="202" 
     ItemsSource="{Binding SourceDocuments}">
     <TreeView.ItemTemplate>
         <HierarchicalDataTemplate ItemsSource="{Binding /Blocks}">
             <TextBlock Text="{Binding /Name}" />
         </HierarchicalDataTemplate>
     </TreeView.ItemTemplate>
 </TreeView>

I get the error message 'Blocks' property not found on 'current item of collection' ''Document'. Why is this?

Upvotes: 0

Views: 424

Answers (1)

brunnerh
brunnerh

Reputation: 184286

You should drop the /, the DataContext in the ItemTemplate is an item, it has no current item itself. Also the Name binding won't work, as the DataContext is still a Document, you can specify the HierarchicalDataTemplate.ItemTemplate, there the DataContext is a DocumentBlock from the Blocks.

You usually use / for a details view outside of the TreeView, e.g. <TextBlock Text="{Binding SourceDocuments/Blocks[0].Name}"/>

Upvotes: 4

Related Questions