2012-06-06 58 views
1

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

包1 Child1 CHILD2 包2 Child3 Child4

代码:

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

使用上面的数据合同,我应该创建一个树视图: 包名称是TreeItem头部值。 每个子项目都是内容为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。这会是一个问题吗? 让我知道我是否缺少任何东西,并建议我解决这个问题的最佳途径。

在此先感谢。

+0

我们,你能得到你的树? – jimmyjambles

回答

1

编辑:

在“套件模板”结合设置为“名”,但是,从类中的公共属性是“包名”。

下面是创建数据并附加它的示例。我已经测试过它,它的工作原理。

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