2

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

4 に答える 4

3

私は entlib のポリシー インジェクションに精通していませんが、インターフェイスを使用しているという事実ではなく、そこに問題があることは確かです。
交換するなら

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

IPerson person = new Person();

確かにそれはうまくいくでしょうか?

于 2008-09-16T21:28:52.153 に答える
1

プロジェクト内のインターフェイス以外にはほとんど何もバインドしませんが、問題はありません。あなたが経験している問題は entlib が原因です... しかし、私は entlib に十分な知識がありません。ただし、WPF はインターフェイスにバインドできます。

于 2008-09-16T21:36:48.377 に答える
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 型を返すかどうかを確認してください。

于 2008-09-16T21:33:25.543 に答える
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 データ バインディング エンジンは public 型でしか動作しません。

于 2012-01-27T22:13:56.093 に答える