我正在尝试使用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}"/>
但是这导致了同样的错误。
感谢您的帮助!
答案 0 :(得分:1)
我看到了一些错误。您需要告诉XAML处理器完全限定的类型名称。由于它不了解C#名称空间,因此您必须使用clr-namespace声明(您有一个,但您没有使用它)。其次,您的StaticResource
应该指向第一个x:Key
上的ObjectDataProvider
属性。这应该有效:
<ObjectDataProvider x:Key="NAME1" ObjectType="{x:Type local:TYPENAME}"/>
<ObjectDataProvider x:Key="NAME2" ObjectInstance="{StaticResource NAME1}" MethodName="METHODNAME"/>
另请注意,您的Binding
也有不正确的StaticResource
。由于我不确定你想要使用哪个ObjectDataProvider
,我没有选择一个。但您需要使用NAME1
或NAME2
作为StaticResource
的密钥。
编辑以使用clr-namespace
有两种方法可以使用clr-namespace
:
如果命名空间来自相同的程序集,则定义XAML:
的xmlns:本地= “CLR-名称空间:myNameSpace对象”
如果命名空间来自不同的程序集(您必须引用项目中正在使用XAML的其他程序集):
的xmlns:本地= “CLR-名称空间:myNameSpace对象;装配= MyAssemblyName”
在您的情况下,看起来两个类型都在同一个程序集中,因此您将使用第一种方法。如果您收到无法找到类型的错误,可能是因为它needs to be a public
type,而您的 internal
(C#中类型的默认保护级别) )。
仅仅为了强调,我将引用MSDN文章:
clr-namespace :在包含的程序集中声明的CLR名称空间 要公开为元素的公共类型。