2008-09-16 16 views
2

WPF formundaki denetimleri bir arabirime bağlamaya çalışıyorum ve arabirimin özelliklerini bulamadığı bir çalışma zamanı hatası alıyorum.WPF bir arabirime bağlanılamıyor mu?

İşte XAML var
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; } 
} 

(bir alıntı): Burada

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

arkasında kod (yine bir alıntı):

İşte

Bir veri kaynağı olarak kullanıyorum sınıf var
var person = PolicyInjection.Wrap<IPerson>(new Person()); 
person.UserId = "jdoe"; 
person.UserName = "John Doe"; 
person.Email = "[email protected]"; 

this.DataContext = person; 

Veri kaynağı olarak kullanıyorum sınıfın bir varlık olması gerektiğine dikkat edin; çünkü Politika Enjeksiyonu entlib'nin Politika Enjeksiyon Uygulama Bloğu.

Ben zamanında bu hatayı alıyorum: Ben EntLib politikası enjeksiyonu ile aşina değilim ama aslında sorun da burada yatıyor, ve eminim

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

cevap

3

olduğunu sen' Bir arayüz kullanıyor.
mutlaka

IPerson person = new Person(); 

işe yarayıp ile

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

yerine olsaydı?

+0

@Robert Jeppesen: Bu, PolicyInjection kodunun çalışmasına izin vermez. – user7116

+0

Robert doğrudur - sorun, WPF veri bağlamasının PolicyInjection.Wrap'ın oluşturduğu proxy sınıfındaki özellikleri tanımıyor olmasıdır. Veri bağlama PI olmadan gayet iyi çalışıyor, bu yüzden onu kullanmayan bir iş bulmaya ihtiyacım var. –

0

Kodda çok yanlış göremiyorum. Teknik olarak, Person sınıfının bir örneğini bağlarsınız (yani, bir arabirime yine de denemek ve anlam vermek anlamsızdır) PolicyInjection.Wrap yönteminizin ne yaptığını bilmiyorum, ancak bir beton döndürdüğünü varsayalım Kişi sınıfı? Neyse,

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

Sana biraz daha o PolicyInjection sınıfa bakmak öneririm ... Ben sadece benim ucunda bu denenmiş ve iyi çalışıyor. Beklediğiniz gibi gerçekten bir Kişi tipi döndürüp döndürmediğini öğrenin.

1

Projemizdeki Arabirimlerden neredeyse hiç bir şey göremiyoruz, hepsi sorunsuz. Yaşadığınız problem entlib'e bağlı ... ama entlib ile orada size yardımcı olacak kadar tanıdık değilim. Bununla birlikte WPF, Arayüzlere bağlanabilir.

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

Ben politika enjeksiyonu ile oluşturulan türünü tahmin Kişi sınıfına dayanır, ancak dinamik ve iç geçerli:

0

deneyin sizin XAML açıkça mülkiyet yolunu belirtmek için. Bildiğim kadarıyla XAML veri bağlayıcı motor sadece kamu türleriyle çalışabilir.

İlgili konular