Mvvm 如何在TreeView Silverlight 4.0中创建数据模板

Mvvm 如何在TreeView Silverlight 4.0中创建数据模板,mvvm,silverlight-4.0,mvvm-light,silverlight-toolkit,Mvvm,Silverlight 4.0,Mvvm Light,Silverlight Toolkit,我有一些复杂的需求,需要在Silverlight中为TreeView创建数据模板。这是使用MVVM设计模式。 以下是我想要的: 包装1 孩子1 孩子2 包装2 孩子3 孩子4 代码: 类包 { 字符串\u名称; 可观察到的收集; 公共observeCollection Childs{get{return}Childs;}set{{u Childs=value;} 公共字符串PackageName{get{return{u Name;}set{{u Name=value;}} } 班童 { 字符串

我有一些复杂的需求,需要在Silverlight中为TreeView创建数据模板。这是使用MVVM设计模式。 以下是我想要的:

包装1 孩子1 孩子2 包装2 孩子3 孩子4

代码:

类包
{
字符串\u名称;
可观察到的收集;
公共observeCollection Childs{get{return}Childs;}set{{u Childs=value;}
公共字符串PackageName{get{return{u Name;}set{{u Name=value;}}
}
班童
{
字符串ChildName;
公共布尔值已启用{get;set;}
公共字符串Id{get;set;}
}
使用上述数据协定,我应该创建一个树状视图: 包名称为TreeItem头值。 每个子项都是一个子框,其内容为ChildName,复选框的Enabled属性绑定到子项的IsEnabled

我尝试了以下代码,但它根本没有显示任何树视图

 <sdk:TreeView x:Name="SelectedPackagesTV" ItemsSource="{Binding Packages, Mode=TwoWay}"
                              ItemTemplate="{StaticResource PackageTemplate}">
                    <sdk:TreeView.Resources>
                        <DataTemplate x:Key="FormsTemplate" >
                            <CheckBox Content="{Binding Id, Mode=TwoWay}" IsEnabled="{Binding IsEnabled}" >

                            </CheckBox>
                        </DataTemplate>
                        <sdk:HierarchicalDataTemplate x:Key="PackageTemplate" ItemsSource="{Binding Childs, Mode=TwoWay}" ItemTemplate="{StaticResource FormsTemplate}">
                            <TextBlock Text="{Binding Name, Mode=TwoWay}" />
                        </sdk:HierarchicalDataTemplate>                            
                    </sdk:TreeView.Resources>                        
                </sdk:TreeView>

注意:我正在视图模型构造函数中向PackageCollection填充值。这会有问题吗? 如果我遗漏了什么,请告诉我,并建议我解决问题的最佳方法

提前感谢。

编辑:

“PackageTemplate”中的绑定设置为“Name”,但类的公共属性为“PackageName”

下面是创建数据并附加数据的示例。我已经测试了这个,它是有效的

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new ViewModel();
    }

    public class Package
    {
        public string Name { get; set; }
        public ObservableCollection<Child> Childs { get; set; }
    }

    public class Child
    {
        public string ChildName { get; set; }
        public bool IsEnabled { get; set; }
    }

    public class ViewModel  : INotifyPropertyChanged
    {
        private ObservableCollection<Package> _packages;

        public event PropertyChangedEventHandler PropertyChanged;

        public string TestStr { get { return "testing123"; } }

        public ViewModel()
        {
            List<Package> list = new List<Package>() { new Package() { Name = "pkg1", Childs = new ObservableCollection<Child>(new List<Child>() { new Child() { ChildName = "Child1" } }) } };
            this.Packages = new ObservableCollection<Package>(list);
        }

        public ObservableCollection<Package> Packages
        {
            get
            {
                return this._packages;
            }
            set
            {
                this._packages = value;
            }
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}
应该是:

ItemTemplate= "{StaticResource PackageTemplate}"
编辑:

“PackageTemplate”中的绑定设置为“Name”,但类的公共属性为“PackageName”

下面是创建数据并附加数据的示例。我已经测试了这个,它是有效的

public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = new ViewModel();
    }

    public class Package
    {
        public string Name { get; set; }
        public ObservableCollection<Child> Childs { get; set; }
    }

    public class Child
    {
        public string ChildName { get; set; }
        public bool IsEnabled { get; set; }
    }

    public class ViewModel  : INotifyPropertyChanged
    {
        private ObservableCollection<Package> _packages;

        public event PropertyChangedEventHandler PropertyChanged;

        public string TestStr { get { return "testing123"; } }

        public ViewModel()
        {
            List<Package> list = new List<Package>() { new Package() { Name = "pkg1", Childs = new ObservableCollection<Child>(new List<Child>() { new Child() { ChildName = "Child1" } }) } };
            this.Packages = new ObservableCollection<Package>(list);
        }

        public ObservableCollection<Package> Packages
        {
            get
            {
                return this._packages;
            }
            set
            {
                this._packages = value;
            }
        }

        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}
应该是:

ItemTemplate= "{StaticResource PackageTemplate}"

我们能拿到你的树吗?我们能拿到你的树吗?
ItemTemplate= {"StaticResoruce PackageTemplate"}
ItemTemplate= "{StaticResource PackageTemplate}"