【发布时间】:2015-04-28 13:50:42
【问题描述】:
我正在用 WPF 做我的第一个更大的项目,我正在用 MVVM 做我的第一个项目。
我想用自定义类列表中的值填充 TreeView。
我的 XAML 部分看起来与此类似:
<Window>
<StackPanel>
...
<TreeView>
<TreeViewItem>
<TreeViewItem />
<TreeViewItem.ItemTemplate>
<HierarchicalDataTemplate
ItemsSource="{Binding ListOfFoo}">
<StackPanel>
<CheckBox VerticalAlignment="Center" Width="50"
Content="{Binding Bar.Description}" IsChecked="{Binding IsChosen}"/>
<TextBox Width="38" VerticalAlignment="Center"
Text="{Binding SomeText}" IsEnabled="{Binding IsChosen}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
</TreeView>
...
</StackPanel>
</Window>
我的 ViewModel 上的属性如下所示:
public List<Foo> ListOfFoo
{
get { return listoffoo; }
set
{
listoffoo = value;
OnPropertyChanged("ListOfFoo");
}
}
Foo 具有 IsChosen、Bar(另一种具有属性 Description 的类型)和 SomeText 属性。
当我执行我的代码时,我可以看到 TreeView 显示了第一个项目(其中有一些 UI 元素,我为了更好地阅读而省略了),但没有显示项目(在我的测试用例中应该是 2)。
我使用了以下资源:
(有人能告诉我 x:Type 来自哪里吗?我的 x 命名空间中没有可用的,它的定义如下:
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
我做错了什么?任何帮助表示赞赏。
【问题讨论】:
-
这是一个简洁的例子,说明它是如何完成的stackoverflow.com/a/28994128/1228你可以创建一个新项目并将代码粘贴进去,它就可以工作了。这样做,然后将其与您当前的项目进行比较,找出不同之处。
-
你没有使用 ObservableCollection,可能是这个问题?
-
您的 x:Type 问题——xmlns 是在 PresentationCore 中定义的。使用 Telerik 的 JustDecompile,加载 net 4.5 框架,然后单击列表中的 PresentationCore。您可以看到指向 System.Windows.Markup 的命名空间的 xmlnsdefinition。这是它的实现方式msdn.microsoft.com/en-us/library/ms753322(v=vs.110).aspx
-
@Will 谢谢你的例子,我会看看:-)。 x:Type 问题可能与我使用 .NET 4.0 有关。我会将项目更改为 4.5m,这可能是问题所在。
-
不,您的 x:Type 问题(不清楚是什么问题)与版本无关。如果有的话,它应该“正常工作”。如果不是,您在引用、代码隐藏或 xaml 中搞砸了一些东西。创建一个新的 wpf 项目。在新项目中检查这三个中的每一个,并确保在你的项目中有等效项。