2008-09-16 4 views
2

私はインターフェイスにWPFフォーム内のコントロールをバインドしようとしていると私はそれがインタフェースのプロパティを見つけることができないことを、実行時エラーが発生します。ここで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 = "[email protected]"; 

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

答えて

3

あなたは「事実ではない、私はentlibの政策注射に慣れていないんだけど、私はあなたの問題があることをかなり確信している、とインターフェイスを使用しています。あなたは

IPerson person = new Person(); 

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

を交換した場合
は確かにそれが働くだろうか?

+0

@Robertジェプセン:彼のPolicyInjectionコードを実行することはできません。 – user7116

+0

ロバートが正しい - 問題は、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は、しかし、インターフェイスにバインドすることができます。

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データバインディングエンジンはパブリックタイプでのみ動作します。