문제

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의 정책 주입 응용 프로그램 블록을 통해 정책 주입을 사용하고 있으므로 데이터 소스로 사용하는 클래스는 엔터티여야 합니다.

런타임에 다음 오류가 발생합니다.

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)'
도움이 되었습니까?

해결책

나는 entlib의 정책 주입에 익숙하지 않지만 인터페이스를 사용하고 있다는 사실이 아니라 문제가 거기에 있다고 확신합니다.
교체를 하게 된다면

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

~와 함께

IPerson person = new Person();

분명 효과가 있겠지?

다른 팁

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

나는 코드에 큰 문제가 없다고 본다.기술적으로는 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 유형을 반환하는지 알아보세요.

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 데이터 바인딩 엔진은 공용 유형에서만 작동할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top