首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XAML ObjectDataProvider,ObjectType错误

XAML ObjectDataProvider,ObjectType错误
EN

Stack Overflow用户
提问于 2013-08-23 16:32:36
回答 1查看 2.4K关注 0票数 2

我试图使用C#实例化XAML中的对象(在ObjectDataProvider中创建的对象)。不幸的是,我收到了以下错误:“类型引用找不到一个名为‘type named’的公共类型”。我有一个与TYPENAME同名的.cs文件。

这是我的XAML:

代码语言:javascript
复制
<Window x:Class="PROJECTNAME.PROJECTFILE"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit"
        xmlns:local="clr-namespace:PROJECTNAME"
        Title="PROJECTFILE" Height="500" Width="500">
    <Window.Resources>
        <ResourceDictionary>
            <!-- Line 9 is the one right below this one. -->
            <ObjectDataProvider x:Key="NAME1" ObjectType="{x:Type TYPENAME}"/> 
            <ObjectDataProvider x:Key="NAME2" ObjectInstance="{StaticResource TYPENAME}" MethodName="METHODNAME"/>
        </ResourceDictionary>
    </Window.Resources>
    <Grid Height="375">
        <DockPanel DataContext="{Binding Source={StaticResource TYPENAME}}" Width="440" Margin="10,20,191,35">
            <dg:DataGrid Name="DG" ItemsSource="{Binding}"/>
        </DockPanel>
        <DockPanel Width="85" Height="25" Margin="0,350,0,0">
            <Frame Name="Frame"/>
            <Button Content="See Posts Info" Click="Button_Click"/>
        </DockPanel>
    </Grid>
</Window>

下面是TYPENAME的C#文件:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace PROJECTNAME
{
    class TYPENAME
    {
        private AccesDBDataSet data_set;
        private AccesDBDataSetTableAdapters.tblTYPENAMETableAdapter TYPENAMEAdapter;

        public TYPENAME()
        {
            data_set = new AccesDBDataSet();
            DataTable tblTYPENAME = data_set.Tables[1];
            TYPENAMEAdapter = new AccesDBDataSetTableAdapters.TYPENAMEAdapterTableAdapter();
            TYPENAMEAdapter.Fill(data_set.tblTYPENAMEAdapter);
        }

        public DataView METHODNAME()
        {
            return data_set.tblTYPENAMEAdapter.DefaultView;
        }
    }
}

那么,为什么XAML的第9行中无法识别TYPENAME呢?我是不是格式化错误了?我试着把它设为

代码语言:javascript
复制
<ObjectDataProvider x:Key="NAME1" ObjectType="{x:Type local:TYPENAME}"/> 

但这也导致了同样的问题。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-23 16:42:33

我看到了一些错误。您需要告诉XAML处理器完全限定的类型名称。因为它不理解C#名称空间,所以您必须使用clr-命名空间声明(您有一个声明,但您没有使用它)。其次,您的StaticResource应该指向第一个ObjectDataProvider上的x:Key属性。这应该是可行的:

代码语言:javascript
复制
<ObjectDataProvider x:Key="NAME1" ObjectType="{x:Type local:TYPENAME}"/>
<ObjectDataProvider x:Key="NAME2" ObjectInstance="{StaticResource NAME1}" MethodName="METHODNAME"/>

还要注意,您的Binding也有一个不正确的StaticResource。因为我不知道你想用哪一个ObjectDataProvider,所以我没有选一个。但是您需要使用NAME1NAME2作为StaticResource的密钥。

用于使用clr命名空间的编辑

有两种使用clr-namespace的方法

  • 如果命名空间来自相同的程序集,则XAML定义为: Xmlns:local=“clr-命名空间:MyNamespace”
  • 如果命名空间来自不同的程序集(必须引用正在使用XAML的项目中的其他程序集): xmlns:local="clr-namespace:MyNamespace;assembly=MyAssemblyName“

在您的例子中,看起来这两种类型都在同一个程序集中,所以您可以使用第一种方法。如果您收到无法找到类型的错误,很可能是因为它是internal,而您的错误是 type (C#中类型的默认保护级别)。

为了强调一下,我将引用MSDN的文章:

clr-namespace:在程序集中声明的CLR命名空间,其中包含要作为元素公开的公共类型。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18407712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档