在 UWP 应用程序中使用 DataTemplate 时出现问题(崩溃,未设置数据)
Problems when using DataTemplate in a UWP app (crashing, data not being set)
我正在尝试 Windows 10 UWP 应用程序开发。我已经安装了 Visual Studio 2015,目前正在尝试弄清楚如何使用数据绑定。
以下是我的简单XAML:
<Grid>
<Pivot x:Name="docPivot"
ItemsSource="{Binding}">
<Pivot.ItemTemplate>
<DataTemplate>
<PivotItem Header="{Binding Filename}">
<TextBox Text="{Binding Contents}"/>
</PivotItem>
</DataTemplate>
</Pivot.ItemTemplate>
</Pivot>
</Grid>
这是我在相关部分的 Mainpage.xaml.cpp:(文档是一个简单的结构,只有两个属性,一个字符串文件名和一个字符串内容。)
MainPage::MainPage()
{
InitializeComponent();
auto docs = ref new Vector<Document^>();
auto doc1 = ref new Document();
doc1->Filename = "Filename1";
doc1->Contents = "Contents 1";
docs->Append(doc1);
auto doc2 = ref new Document();
doc2->Filename = "Filename2";
doc2->Contents = "Contents 2";
docs->Append(doc2);
docPivot->ItemsSource = docs;
}
但是,我遇到了两个无法解决的问题:
首先,不是每个 PivotItem 的 header 都是 Filename
,它们都是 MyApp.Document,其中 MyApp 是我的命名空间。
第二个问题是,TextBox 正在使用数据绑定的内容正确填充,并且可以在两个 PivotItems 之间切换,但是一旦我尝试 select 一个 Textbox,应用程序因访问冲突而崩溃:
Exception thrown at 0x0004CE1E in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
关于我在这里做错了什么的任何意见?
首先,您必须将 Bindable 属性添加到 Document
class。
[Windows::UI::Xaml::Data::Bindable]
public ref class Document sealed
而且你必须添加
#include "Document.h"
在 Mainpage.xaml.h
文件中而不是 .cpp
文件中。你的 Pivot 的 ItemTemplate 不应该包含 PivotItem,你应该这样做
<Grid>
<Pivot x:Name="docPivot">
<Pivot.HeaderTemplate>
<DataTemplate>
<ContentControl Content="{Binding Filename}"/>
</DataTemplate>
</Pivot.HeaderTemplate>
<Pivot.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Contents}"/>
</DataTemplate>
</Pivot.ItemTemplate>
</Pivot>
我正在尝试 Windows 10 UWP 应用程序开发。我已经安装了 Visual Studio 2015,目前正在尝试弄清楚如何使用数据绑定。
以下是我的简单XAML:
<Grid>
<Pivot x:Name="docPivot"
ItemsSource="{Binding}">
<Pivot.ItemTemplate>
<DataTemplate>
<PivotItem Header="{Binding Filename}">
<TextBox Text="{Binding Contents}"/>
</PivotItem>
</DataTemplate>
</Pivot.ItemTemplate>
</Pivot>
</Grid>
这是我在相关部分的 Mainpage.xaml.cpp:(文档是一个简单的结构,只有两个属性,一个字符串文件名和一个字符串内容。)
MainPage::MainPage()
{
InitializeComponent();
auto docs = ref new Vector<Document^>();
auto doc1 = ref new Document();
doc1->Filename = "Filename1";
doc1->Contents = "Contents 1";
docs->Append(doc1);
auto doc2 = ref new Document();
doc2->Filename = "Filename2";
doc2->Contents = "Contents 2";
docs->Append(doc2);
docPivot->ItemsSource = docs;
}
但是,我遇到了两个无法解决的问题:
首先,不是每个 PivotItem 的 header 都是 Filename
,它们都是 MyApp.Document,其中 MyApp 是我的命名空间。
第二个问题是,TextBox 正在使用数据绑定的内容正确填充,并且可以在两个 PivotItems 之间切换,但是一旦我尝试 select 一个 Textbox,应用程序因访问冲突而崩溃:
Exception thrown at 0x0004CE1E in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
关于我在这里做错了什么的任何意见?
首先,您必须将 Bindable 属性添加到 Document
class。
[Windows::UI::Xaml::Data::Bindable]
public ref class Document sealed
而且你必须添加
#include "Document.h"
在 Mainpage.xaml.h
文件中而不是 .cpp
文件中。你的 Pivot 的 ItemTemplate 不应该包含 PivotItem,你应该这样做
<Grid>
<Pivot x:Name="docPivot">
<Pivot.HeaderTemplate>
<DataTemplate>
<ContentControl Content="{Binding Filename}"/>
</DataTemplate>
</Pivot.HeaderTemplate>
<Pivot.ItemTemplate>
<DataTemplate>
<TextBox Text="{Binding Contents}"/>
</DataTemplate>
</Pivot.ItemTemplate>
</Pivot>