2008-09-16 4 views
2

WPF 폼의 컨트롤을 인터페이스에 바인딩하려고하는데 런타임 오류가 발생하여 인터페이스의 속성을 찾을 수 없습니다.WPF 인터페이스에 Databind 할 수 없습니까?

가 여기에 XAML을의
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; } 
} 

(발췌) : 여기

<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 = "[email protected]"; 

this.DataContext = person; 

제가 Policy Injection을 통해 t를 사용하고 있기 때문에 제가 데이터 소스로 사용하고있는 클래스는 엔티티 여야합니다. 그는 entlib의 Policy Injection Application Block을 사용합니다.

내가 런타임에이 오류를 받고 있어요 : 나는 entlib의 정책 주입에 익숙하지 않은,하지만 난이 사실에 문제가있다, 그리고 꽤 확신

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)' 

답변

3

당신 ' 인터페이스를 사용하여.
당신은 확실히

IPerson person = new Person(); 

작동 것으로

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

을 대체한다면?

+0

@Robert Jeppesen : PolicyInjection 코드를 실행할 수 없습니다. – user7116

+0

Robert가 맞습니다 - WPF 데이터 바인딩이 PolicyInjection.Wrap이 만드는 프록시 클래스의 속성을 인식하지 못하는 문제가 있습니다. PI가 없으면 데이터 바인딩이 제대로 작동하므로 사용하지 않는 작업을 수행해야합니다. –

0

코드에별로 문제가 없습니다. 기술적으로 당신은 Person 클래스의 인스턴스를 바인딩하고있다. (즉, 어쨌든 인터페이스에 시도하고 바인딩하는 것은 의미가 없다.) PolicyInjection.Wrap 메서드가 무엇인지는 모르겠지만, 그것이 콘크리트를 반환한다고 가정하고있다. Person 클래스? 어쨌든,

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 유형을 실제로 리턴하는지 알아보십시오.

1

우리는 프로젝트의 인터페이스에 거의 아무런 문제없이 바인딩합니다. 당신이 겪고있는 문제는 entlib 때문입니다 ...하지만 entlib에 익숙하지 않아서 당신을 도울 수 없습니다. 그러나 WPF는 인터페이스에 바인딩 할 수 있습니다.

<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 클래스를 기반으로하지만, 동적 및 내부입니다 :

0

시도는 XAML에서 명시 적 속성 경로를 지정합니다. 내가 아는 한 XAML 데이터 바인딩 엔진은 공용 유형에서만 작동 할 수 있습니다.

관련 문제