1

我有一些复杂的要求要在 Silverlight 中为 TreeView 创建一个 DataTemplate。这是使用 MVVM 设计模式。这就是我想要的:

套餐 1 孩子 1 孩子 2 套餐 2 孩子 3 孩子 4

代码:

 Class Package
 {
   string _Name;
   ObservableCollection<Child> _Childs;
public ObservableCollection<Child> Childs{get{return _Childs; } set{_Childs=value;}}
public string PackageName{get{return _Name; } set{_Name=value;}}

  }

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

使用上面的数据契约,我应该创建一个树视图:Package Name being TreeItem header value。每个子项都是一个子框,内容为 ChildName,复选框的 Enabled 属性绑定到 Child 的 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>

注意:我将值填充到视图模型构造函数中的 PackagesCollection。这会是个问题吗?如果我遗漏任何东西,请告诉我,并建议我解决此问题的最佳方法。

提前致谢。

4

1 回答 1

1

编辑:

“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));
            }
        }
    }
}

一些东西:

您的业​​务对象应如下所示:

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; }
    }

绑定只能作用于公共属性,不能作用于私有字段

您的 xaml 可以更正为:

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

    <sdk:DataTemplate x:Key="ChildTemplate" >
        <CheckBox  Content="{Binding ChildName,Mode=TwoWay}"
                       IsEnabled="{Binding IsEnabled}">
        </CheckBox>
    </sdk:DataTemplate>
</sdk:TreeView.Resources>

模板需要位于 TreeView 或 UserControl 的封闭“资源”括号中。

您的 PackageTemplate 应该有 ItemsSource “Childs”而不是 Packages。您将 PackageTemplate 绑定到“PackageName”,但 Package 类声明“Name”。

不是错误,而是因为您的 ChildTemplate 没有自己的子级,它只需要是一个 DataTemplate,没有层次结构。

ItemTemplate= {"StaticResoruce PackageTemplate"}

应该:

ItemTemplate= "{StaticResource PackageTemplate}"
于 2012-06-07T00:31:54.430 回答