2012-06-06 52 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}"