2012-06-06 3 views
1

У меня есть сложное требование для создания DataTemplate для TreeView в Silverlight. Это использует шаблон проектирования MVVM. вот что я хочу:Как создать DataTemplate в TreeView Silverlight 4.0

Package1 Child1 Child2 Package2 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. Каждый дочерний элемент является дочерним полем с содержимым - дочернее имя, а свойство Enabled этого флажка привязано к IsEnabled of Child.

Я пробовал следующий код, но он не показывает никакого древовидного вида вообще.

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

ПРИМЕЧАНИЕ. Я заполняю значения в PackageagesCollection в конструкторе модели представления. Будет ли это проблемой? Сообщите мне, если у меня что-то отсутствует, а также предложите мне лучший способ решить эту проблему.

Заранее спасибо.

+0

Мы вы можете получить ваше дерево? – jimmyjambles

ответ

1

Edit:

Связывание в «PackageTemplate» установлено значение «Имя», но общественная собственность на классе «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 указывает «Имя».

Не ошибка, а потому, что ваш ChildTemplate не имеет собственных детей, он должен быть только DataTemplate, без иерархии.

Также

ItemTemplate= {"StaticResoruce PackageTemplate"} 

Должно быть:

ItemTemplate= "{StaticResource PackageTemplate}" 
Смежные вопросы