سؤال

أحاول ربط عناصر التحكم في 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 يمكن ربط الواجهات.

لا أرى خطأ في التعليمات البرمجية.من الناحية الفنية أنت ملزم مثيل من فئة الشخص (أي فإنه لا معنى لمحاولة ربط واجهة على أي حال) أنا لا أعرف ما PolicyInjection.التفاف الطريقة لا, ولكن أنا على افتراض أنه عوائد ملموسة شخص الصف ؟ على أي حال, أنا جربت هذا في النهاية و أنه يعمل بشكل جيد...

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 فئة أكثر قليلا.معرفة ما إذا كان حقا لا عودة الشخص اكتب كما كنت تتوقع.

محاولة تحديد الملكية مسار صراحة في 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)}" /> 

اعتقد نوع الناتجة عن حقن سياسة تقوم على فئة الشخص ، ولكن الديناميكية الداخلية.بقدر ما أعرف XAML ربط البيانات محرك يمكن أن تعمل فقط مع أنواع العامة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top