c# - Windows 通用项目不支持数据类型 "AnyName"(x :DataType for DataTemplate)

标签 c# win-universal-app datatemplate master-detail

尝试做简单的example在 Windows 通用项目中使用主详细信息的方法。但 VS 显示错误:Windows 通用项目不支持 DataType“Any Name”。或者,如果没有数据类型,则没有为数据模板定义数据类型。在 stackoverflow 或其他地方找不到答案。你能帮我吗?

代码:

MasterDetailPage.xaml

<Page
x:Class="App1.Pages.MasterDetailPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1.Pages"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
NavigationCacheMode="Enabled"
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

<Page.Transitions>
    <TransitionCollection>
        <NavigationThemeTransition />
    </TransitionCollection>
</Page.Transitions>

<Page.Resources>
    <DataTemplate x:Key="MasterListViewItemTemplate" x:DataType="viewmodels:ItemViewModel">
        <Grid Margin="0,11,0,13">
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                <RowDefinition Height="Auto" />
            </Grid.RowDefinitions>

            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

            <TextBlock Text="{x:Bind Title}" Style="{ThemeResource BaseTextBlockStyle}" />

            <TextBlock
                Text="{x:Bind Text}"
                Grid.Row="1"
                MaxLines="1"
                Style="{ThemeResource ListBodyTextBlockStyle}" />

            <TextBlock
                Text="{x:Bind DateCreatedHourMinute}"
                Grid.Column="1"
                Margin="12,1,0,0"
                Style="{ThemeResource ListCaptionAltTextblockStyle}" />
        </Grid>
    </DataTemplate>

    <DataTemplate x:Key="DetailContentTemplate" x:DataType="viewmodels:ItemViewModel">
        <StackPanel>
            <TextBlock
                Margin="0,8"
                Style="{ThemeResource TitleTextBlockStyle}"
                HorizontalAlignment="Left"
                Text="{x:Bind Title}"/>

            <TextBlock
                Margin="0,9"
                HorizontalAlignment="Left"
                MaxWidth="560"
                Style="{ThemeResource BodyTextBlockStyle}"
                Text="{x:Bind Text}" />
        </StackPanel>
    </DataTemplate>
</Page.Resources>

<Grid x:Name="LayoutRoot" Loaded="LayoutRoot_Loaded">
    <VisualStateManager.VisualStateGroups>
        <VisualStateGroup x:Name="AdaptiveStates" CurrentStateChanged="AdaptiveStates_CurrentStateChanged">
            <VisualState x:Name="DefaultState">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="720" />
                </VisualState.StateTriggers>
            </VisualState>

            <VisualState x:Name="NarrowState">
                <VisualState.StateTriggers>
                    <AdaptiveTrigger MinWindowWidth="0" />
                </VisualState.StateTriggers>

                <VisualState.Setters>
                    <Setter Target="MasterColumn.Width" Value="*" />
                    <Setter Target="DetailColumn.Width" Value="0" />
                    <Setter Target="MasterListView.SelectionMode" Value="None" />
                </VisualState.Setters>
            </VisualState>
        </VisualStateGroup>
    </VisualStateManager.VisualStateGroups>

    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="MasterColumn" Width="320" />
        <ColumnDefinition x:Name="DetailColumn" Width="*" />
    </Grid.ColumnDefinitions>

    <TextBlock
        Text="My Items"
        Margin="12,8,8,8"
        Style="{ThemeResource TitleTextBlockStyle}" />

    <ListView
        x:Name="MasterListView"
        Grid.Row="1"
        ItemContainerTransitions="{x:Null}"
        ItemTemplate="{StaticResource MasterListViewItemTemplate}"
        IsItemClickEnabled="True"
        ItemClick="MasterListView_ItemClick">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            </Style>
        </ListView.ItemContainerStyle>
    </ListView>

    <ContentPresenter
        x:Name="DetailContentPresenter"
        Grid.Column="1"
        Grid.RowSpan="2"
        BorderThickness="1,0,0,0"
        Padding="24,0"
        BorderBrush="{ThemeResource SystemControlForegroundBaseLowBrush}"
        Content="{x:Bind MasterListView.SelectedItem, Mode=OneWay}"
        ContentTemplate="{StaticResource DetailContentTemplate}">
        <ContentPresenter.ContentTransitions>
            <!-- Empty by default. See MasterListView_ItemClick -->
            <TransitionCollection />
        </ContentPresenter.ContentTransitions>
    </ContentPresenter>
</Grid>

ItemViewModel

using App1.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Globalization.DateTimeFormatting;

namespace App1.ViewModels
{
    public class ItemViewModel
    {
        private int _itemId;

        public int ItemId
        {
            get
            {
                return _itemId;
            }
        }

        public string DateCreatedHourMinute
        {
            get
            {
                var formatter = new DateTimeFormatter ("hour minute");
                return formatter.Format (DateCreated);
            }
        }

        public string Title
        {
            get; set;
        }
        public string Text
        {
            get; set;
        }
        public DateTime DateCreated
        {
            get; set;
        }

        public ItemViewModel ()
        {
        }

        public static ItemViewModel FromItem (Item item)
        {
            var viewModel = new ItemViewModel ();

            viewModel._itemId = item.Id;
            viewModel.DateCreated = item.DateCreated;
            viewModel.Title = item.Title;
            viewModel.Text = item.Text;

            return viewModel;
        }
    }
}

需要更多此代码吗?

最佳答案

您的 Xaml 中缺少 ViewModels 命名空间的命名空间声明。

在顶部添加:

xmlns:viewmodels="using:App1.ViewModels"

将其想象为 Xml 的 using 语句。设置完成后,您可以使用 Xml 中的 viewmodel: 来使用 App1.ViewModels 中的类。如果没有它,解析器甚至不知道这些类的存在。

关于c# - Windows 通用项目不支持数据类型 "AnyName"(x :DataType for DataTemplate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34878302/

相关文章:

c# - 升级到 Windows 10 后 WMI 不工作

c# - 更改禁用文本框的颜色

c# - 在 Windows 10 通用应用程序中获取位置

mvvm - 带有 MVVM Light 的 Windows 应用商店应用程序中的附加行为

c# - 我可以在 string.Format 中格式化 NULL 值吗?

c# - 如何调试卡在 Windows Phone 8.1 上的应用程序

c# - 自定义 TabItem 数据模板

wpf - 无法识别隐式映射到System.Xml.XmlDocument的DataTemplate

c# - 如何在新页面上打开 ListView 项目

xaml - 通用 Windows InkCanvas 笔触在 RenderTargetBitmap.RenderAsync 上消失