【问题标题】:How to create DataTemplate in TreeView Silverlight 4.0如何在 TreeView Silverlight 4.0 中创建 DataTemplate
【发布时间】:2012-06-10 23:39:10
【问题描述】:

我有一些复杂的要求要在 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;}
  }

使用上面的数据契约我应该创建一个树视图: 包名称为 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。这会是个问题吗? 如果我遗漏了什么,请告诉我,并建议我解决此问题的最佳方法。

提前致谢。

【问题讨论】:

  • 我们能得到你的树吗?

标签: mvvm silverlight-4.0 mvvm-light silverlight-toolkit


【解决方案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}"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多