Frage

Ich versuche Kontrollen in einer WPF-Form an eine Schnittstelle zu binden, und ich einen Laufzeitfehler erhalten, dass es nicht die Eigenschaften der Schnittstelle finden kann.

Hier ist die Klasse I als Datenquelle bin mit:

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

Hier ist der XAML (ein Auszug):

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

Hier ist der Code hinter (auch hier ein Auszug):

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

this.DataContext = person;

Beachten Sie, dass die Klasse I als Datenquelle bin mit muss ein Unternehmen sein, weil ich Politik Injektion durch die EntLib Policy Injection Application Block bin mit.

Ich erhalte diesen Fehler zur Laufzeit:

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)'
War es hilfreich?

Lösung

Ich bin mit EntLib Politik Injektion nicht vertraut, aber ich bin mir ziemlich sicher, dass Ihr Problem liegt dort, und nicht in der Tatsache, dass Sie eine Schnittstelle verwenden.
Wenn Sie ersetzen sind

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

mit

IPerson person = new Person();

sicher würde es?

Andere Tipps

Wir binden an fast nichts anderes als Schnittstellen in unserem Projekt, alles ohne Problem. Das Problem, das Sie erleben, ist aufgrund EntLib ... aber ich bin nicht vertraut genug mit EntLib Sie dort zu helfen. WPF kann jedoch binden an Schnittstellen.

ich mit dem Code nicht viel falsch sehen. Technisch sind Sie eine Instanz der Klasse Person Bindung (dh es keinen Sinn macht sowieso an eine Schnittstelle zu versuchen und zu binden) Ich weiß nicht, was Ihre PolicyInjection.Wrap Methode tut, aber ich gehe davon aus gibt es einen konkreten Person-Klasse? Wie auch immer, ich habe gerade versucht, diese auf meinem Ende und es funktioniert gut ...

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

Ich würde vorschlagen, dass Sie diese PolicyInjection Klasse Blick in ein bisschen mehr. Finden Sie heraus, ob es wirklich eine Person Typ zurückgibt, wie Sie es erwarten.

Versuche Eigenschaft Pfad explizit in XAML angeben:

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

Ich denke, die durch Politik Injektion erzeugte Art auf Person-Klasse basiert, sondern ist dynamisch und interne. Soweit ich XAML Datenbindungsmodul kennen nur mit öffentlichen Typen arbeiten können.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top