我试图将WPF形式的控件绑定到接口,但遇到运行时错误,提示找不到接口的属性。

这是我用作数据源的类:

public interface IPerson
{
    string UserId { get; set; }
    string UserName { get; set; }
    string Email { get; set; }
}

public class Person : EntityBase, IPerson
{
    public virtual string UserId { get; set; }
    public string UserName { get; set; }
    public virtual string Email { get; set; }
}

这是XAML(摘录):

<TextBox Name="userIdTextBox" Text="{Binding UserId}" />
<TextBox Name="userNameTextBox" Text="{Binding UserName}" />
<TextBox Name="emailTextBox" Text="{Binding Email}" />

这是背后的代码(再次摘录):

var person = PolicyInjection.Wrap<IPerson>(new Person());
person.UserId = "jdoe";
person.UserName = "John Doe";
person.Email = "jdoe@live.com";

this.DataContext = person;

请注意,我用作数据源的类必须是一个实体,因为我通过entlib的Policy Injection Application Block使用Policy Injection。

我在运行时遇到此错误:

System.Windows.Data Error: 16 : Cannot get 'Email' value (type 'String') from '' (type 'Person'). BindingExpression:Path=Email; DataItem='Person' (HashCode=22322349); target element is 'TextBox' (Name='emailTextBox'); target property is 'Text' (type 'String') TargetException:'System.Reflection.TargetException: Object does not match target type.
   at System.Reflection.RuntimeMethodInfo.CheckConsistency(Object target)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture)
   at System.Reflection.RuntimePropertyInfo.GetValue(Object obj, Object[] index)
   at MS.Internal.Data.PropertyPathWorker.GetValue(Object item, Int32 level)
   at MS.Internal.Data.PropertyPathWorker.RawValue(Int32 k)'

===============>>#1 票数:3 已采纳

我不熟悉entlib的策略注入,但是我很确定您的问题就在这里,而不是因为您使用的是接口。
如果要更换

var person = PolicyInjection.Wrap<IPerson>(new Person());

IPerson person = new Person();

肯定会起作用吗?

===============>>#2 票数:1

除了项目中的接口外,我们几乎绑定任何东西,所有这些都没有问题。 您遇到的问题是由于entlib引起的...但是我对entlib不够了解,无法在此为您提供帮助。 但是,WPF可以绑定到接口。

===============>>#3 票数:0

我认为代码没有多大错误。 从技术上讲,您正在绑定Person类的实例(即无论如何尝试都没有必要绑定到接口)我不知道您的PolicyInjection.Wrap方法会做什么,但是我假设它返回了一个具体的人类? 无论如何,我只是尝试了一下,效果很好...

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();

        IPerson person = new Person() { FirstName = "Hovito" };

        this.DataContext = person;
    }
}

public class Person : IPerson
{
    public virtual string FirstName { get; set; }
    public string LastName { get; set; }
}

public interface IPerson
{
    string FirstName { get; set; }
    string LastName { get; set; }
}

我建议您多研究一下PolicyInjection类。 找出它是否确实返回了您所期望的Person类型。

===============>>#4 票数:0

尝试在XAML中显式指定属性路径:

<TextBox Name="userIdTextBox" Text="{Binding (myns:IPerson.UserId)}" /> 
<TextBox Name="userNameTextBox" Text="{Binding (myns:IPerson.UserName)}" /> 
<TextBox Name="emailTextBox" Text="{Binding (myns:IPerson.Email)}" /> 

我猜想策略注入生成的类型基于Person类,但是是动态的和内部的。 据我所知,XAML数据绑定引擎只能与公共类型一起使用。

  ask by Matt Casto translate from so

未解决问题?本站智能推荐:

3回复

将WPF控件绑定到模型对象上动态引入的接口

我正在使用PostSharp的[CompositionAspect]功能在我的WPF应用程序中动态地将接口​​插入模型对象。 但是,似乎WPF无法正确绑定(显示)属性,除非在模型对象上显式实现了相关接口? 使用自定义的CompositionAspect(ComposeObjectAspe
1回复

WPF为接口指定HierarchicalDataTemplate

我在WPF中发现了一个非常奇怪的怪癖。 如果我为一个接口指定一个DataTemplate ,它将在ItemsControl.ItemTemplate定义,但如果在ItemsControl.Resrouces定义则不起作用。 具体例子: 我有一个我想要表示的树结构。 树中的所有项都
1回复

如何实现IEditableCollectionView接口

谁能告诉我如何实现IEditableCollectionView接口? 我正在尝试使用自定义列表将数据绑定到WPF(C#)中的数据网格,并且需要实现此接口来编辑数据。 谢谢。
1回复

无法数据绑定DependencyProperty

我有一个带有DependencyProperty的UserControl。 我使用数据绑定表达式在主机窗口中设置它的值。 但是,它没有按预期工作。 来自用户控件的代码隐藏的片段: 并且从XAML(注意:CasingListView继承自ViewBase): 什么都没有发
1回复

Winforms数据绑定与接口继承

在我因为这个问题而改变应用程序域之前,我需要有人确认我所看到的内容。 问题是,当对相互继承的接口进行数据绑定时,您无法在基接口上看到这些属性。 我正在使用数据绑定的WinForms应用程序。 这是在.net3.5,不,我不能使用wpf。 无论如何,我有一个像这样的设置。
6回复

WPF数据绑定到接口而不是实际对象 - 可能吗?

说我有这样的界面: 我还有几个实现这个接口的类; 现在我有一个WPF ListBox列出了ISomeInterface的项目,使用自定义DataTemplate。 数据绑定引擎显然不会(我已经弄明白)允许我绑定到接口属性 - 它看到该对象是一个SomeClass对象,并且数
3回复

通过.NET中的某种接口使属性可用于数据绑定?

我有一个以特定方式实现属性的类,以处理我们的业务逻辑系统的一些自定义要求。 这种“特定方式”使属性在数据绑定的上下文中不起作用。 基本上,如果我将类的对象拖放到表单上,则数据绑定在该对象上什么也找不到,并且尽管该对象列出了属性,但该对象的属性检查器不允许我对其进行编辑。 我想知道的
1回复

WPF数据绑定

考虑以下XAML代码: 我了解Text属性绑定的工作方式。 在内部将其转换为类似以下内容的内容: 但是Background如何绑定到同一源? 这段代码: 是不正确的。 如何运作? 顺便说一句,它可以工作并显示正确的背景色。 我看到的唯一方法是获取具有给定名称
1回复

WPF中的数据绑定

我在文本块中进行数据绑定时遇到麻烦。 我想做的是,每当在任何类中发生异常时,我都希望在Text Block中显示它,但由于某种原因它不会消失。 Main.xaml Main.xaml.cs Page1.xaml Page1.xaml.cs Class2
1回复

数据绑定WPF

我想用TextBox创建一个控件,并将TextBox.Text属性与我自己的Dependency Property TextProp绑定。 (某种实验)但是,绑定无效! 我做错了什么? XAML: C#: