Silverlight Treeview内联HierarchicalDataTemplate绑定问题

时间:2012-03-13 17:08:41

标签: silverlight xaml

我有MyPOCO对象的MyCollection(有两个字符串属性)。

当我尝试将HierarchicalDataTemplate实现到树视图中时,绑定不起作用,我得到了类名。

我知道如果我从控件中取出datatemplate一切正常,但我很想知道为什么这个例子不起作用。

<Grid x:Name="LayoutRoot" Background="White" DataContext="{Binding Source={StaticResource testVM}}">
    <sdk:TreeView Margin="8,8,8,111" ItemsSource="{Binding MyCollection}">
        <sdk:HierarchicalDataTemplate ItemsSource="{Binding MyPOCO}">
            <sdk:HierarchicalDataTemplate.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Property1}"/>
                        <TextBlock Text="{Binding Property2}"/>
                    </StackPanel>
                </DataTemplate>
            </sdk:HierarchicalDataTemplate.ItemTemplate>
        </sdk:HierarchicalDataTemplate>
    </sdk:TreeView>
</Grid>

这也是ViewModel。

namespace MyPOCProject

{     公共课MyPOCO     {         私有字符串property1;

    public string Property1
    {
        get { return property1; }
        set { property1 = value; }
    }

    private string property2;

    public string Property2
    {
        get { return property2; }
        set { property2 = value; }
    }

    public MyPOCO(string p1, string p2)
    {
        property1 = p1;
        property2 = p2;
    }
}

public class MyViewModel : INotifyPropertyChanged
{
    private ObservableCollection<MyPOCO> myCollection;

    public ObservableCollection<MyPOCO> MyCollection
    {
        get { return myCollection; }
        set { myCollection = value; RaisePropertyChanged("MyCollection"); }
    }

    public MyViewModel()
    {
        MyPOCO _poco1 = new MyPOCO("aaa1", "bbb1");
        MyPOCO _poco2 = new MyPOCO("aaa2", "bbb2");
        MyPOCO _poco3 = new MyPOCO("aaa3", "bbb3");

        MyCollection = new ObservableCollection<MyPOCO>() { _poco1, _poco2, _poco3 };
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

}

那么我做错了什么?

再次......我对这个特殊的例子很感兴趣。我想知道这个例子有什么问题以及原因。

感谢。

1 个答案:

答案 0 :(得分:2)

您发布的代码不是分层的,换句话说:MyPOCO类不包含属性MyCollection<MYPOCO>子级。 以下是HierarchicalDataTemplate

的示例

的Xaml:

<sdk:TreeView x:Name="MyTreeView"
              HorizontalAlignment="Left"
              ItemsSource="{Binding MyCollection}"
              Width="200" Height="280">
    <sdk:TreeView.ItemTemplate>
        <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
            <TextBlock Text="{Binding Path=Header}"/>
            <sdk:HierarchicalDataTemplate.ItemTemplate>
                <sdk:HierarchicalDataTemplate ItemsSource="{Binding Path=Children}">
                    <TextBlock Text="{Binding Path=Header}"/>
                </sdk:HierarchicalDataTemplate>
            </sdk:HierarchicalDataTemplate.ItemTemplate>
        </sdk:HierarchicalDataTemplate>
    </sdk:TreeView.ItemTemplate>
</sdk:TreeView>

Codebehind类:

public class MyPoco
{
    public MyPoco(string header, int sampleChildrenCount)
    {
        this.Header = header;
        this.Children = new ObservableCollection<MyPoco>();
        if (sampleChildrenCount > 0)
        {
            for (int i = 0; i < sampleChildrenCount; i++)
            {
                string newHeader = String.Format("Test {0}", sampleChildrenCount * i);
                var myPoco = new MyPoco(newHeader, sampleChildrenCount - 1)
                this.Children.Add(myPoco);
            }
        }
    }
    public string Header { get; set; }
    public ObservableCollection<MyPoco> Children { get; set; }
}

public class MyViewModel
{
    public MyViewModel()
    {
        MyCollection = new ObservableCollection<MyPoco>();
        for (int i = 0; i < 6; i++)
        {
            this.MyCollection.Add(new MyPoco(String.Format("Test {0}", i), 5));
        }
    }
    public ObservableCollection<MyPoco> MyCollection { get; set; }
}

Codebehind启动:

public MainPage()
{
    public MainPage()
    {
        InitializeComponent();
        MyTreeView.DataContext = new MyViewModel();
    }
}