gpt4 book ai didi

mvvm - 如何在 TreeView Silverlight 4.0 中创建 DataTemplate

转载 作者:行者123 更新时间:2023-12-03 10:39:19 24 4
gpt4 key购买 nike

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

包1
child 1
child 2
包2
child 3
child 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;}
}

使用上面的数据合约,我应该创建一个 TreeView :
包名称为 TreeItem header 值。
每个子项都是一个子框,内容为 ChildName,复选框的 Enabled 属性绑定(bind)到 Child 的 IsEnabled。

我已经尝试了以下代码,但它根本没有显示任何 TreeView 。
 <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>

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

提前致谢。

最佳答案

编辑:

“PackageTemplate”中的绑定(bind)设置为“Name”,但类的公共(public)属性是“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; }
}

绑定(bind)只能作用于公共(public)属性,不能作用于私有(private)字段

您的 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 绑定(bind)到“PackageName”,但 Package 类声明“Name”。

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


ItemTemplate= {"StaticResoruce PackageTemplate"}

应该:
ItemTemplate= "{StaticResource PackageTemplate}"

关于mvvm - 如何在 TreeView Silverlight 4.0 中创建 DataTemplate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922969/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com