2

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

这是我的 XAML:

<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# 文件:

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;
        }
    }
}

那么,为什么 TYPENAME 在 XAML 的第 9 行中无法识别呢?我的格式不正确吗?我尝试将其设置为

<ObjectDataProvider x:Key="NAME1" ObjectType="{x:Type local:TYPENAME}"/> 

但这导致了同样的错误。

谢谢您的帮助!

4

1 回答 1

3

我看到几个错误。您需要告诉 XAML 处理器完全限定的类型名称。由于它不理解 C# 命名空间,因此您必须使用 clr-namespace 声明(您有一个,但您没有使用它)。其次,您StaticResource应该指向x:Keyfirst 上的属性ObjectDataProvider。这应该有效:

<ObjectDataProvider x:Key="NAME1" ObjectType="{x:Type local:TYPENAME}"/>
<ObjectDataProvider x:Key="NAME2" ObjectInstance="{StaticResource NAME1}" MethodName="METHODNAME"/>

另请注意,您Binding也有错误StaticResource。由于我不确定ObjectDataProvider您要使用哪个,所以我没有选择一个。但是您需要使用NAME1NAME2作为StaticResource.

编辑以使用 clr-namespace

有两种使用方法clr-namespace

  • 如果命名空间来自同一个程序集,则 XAML 定义在:

    xmlns:local="clr-命名空间:我的命名空间"

  • 如果命名空间来自不同的程序集(您必须在项目中引用正在使用 XAML 的其他程序集):

    xmlns:local="clr-namespace:MyNamespace;assembly=MyAssemblyName"

在您的情况下,看起来这两种类型都在同一个程序集中,因此您将使用第一种方法。如果您收到找不到类型的错误,可能是因为它需要是一个public类型,而您的类型是internal(C# 中类型的默认保护级别)。

只是为了强调,我将引用该 MSDN 文章:

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

于 2013-08-23T16:42:33.437 回答