2015-09-04 16 views
9

Quando si utilizza x: Bind in un'applicazione UWP XAML considerare quanto segue:UWP XAML x: interfacce Bind ereditato non sono riconosciuti

interface IBaseInterface 
{ 
    string A { get; set; } 
} 
interface ISubInterface : IBaseInterface 
{ 
    string B { get; set; } 
} 
class ImplementationClass : ISubInterface 
{ 
    public string A { get; set; } 
    public string B { get; set; } 
} 

Nella classe pagina abbiamo la seguente:

public partial class MainPage : Page 
{ 
    public ISubClass TheObject = new ImplementationClass { A = "1", B = "2" }; 
    //All the rest goes here 
} 

nel MainPage XAML abbiamo il seguente frammento:

<TextBlock Text={x:Bind Path=TheObject.A}></TextBlock> 

che causa il seguente errore del compilatore: XamlCompiler errore WMC1110: binding non valido percorso 'A': proprietà 'A' non può essere trovato sul tipo 'ISubInterface'

Il seguente funziona comunque:

<TextBlock Text={x:Bind Path=TheObject.B}></TextBlock> 

Qualcuno sa se si tratta di un limiti noti della piattaforma XAML UWP che le proprietà dell'interfaccia ereditate non sono riconosciute dal compilatore? O dovrebbe essere considerato un bug? Esistono soluzioni alternative note?

L'aiuto è molto apprezzato. Grazie in anticipo!

+2

Puoi provare a definire 'TheObject' come' IBaseInterface' piuttosto che 'ISubInterface' e vedere se il compilatore poi accetta' TheObject.A'? – dognose

risposta

7

Sì, dopo aver eseguito alcuni test e la ricerca, sembra che le proprietà dell'interfaccia ereditate non vengano riconosciute dal compilatore quando si utilizza X: Bind.

Come soluzione alternativa si può utilizzare la tradizionale Binding posto della X: Bind come segue:

Nella XAML:

<Grid Name="MyRootGrid"> 
     <TextBlock Text="{Binding A}"></TextBlock> 
</Grid> 

Nelle xaml.cs:

MyGrid.DataContext = TheObject; 
+0

Grazie per aver provato e venire alla stessa conclusione che ho fatto. Ho inviato un bug tramite Connect: https://connect.microsoft.com/VisualStudio/feedback/details/1770944 –

0

Se scrivi una classe Foo ha ereditato IFoo.

public class Foo : INotifyPropertyChanged, IF1 
{ 
    public Foo(string name) 
    { 
     _name = name; 
    } 

    private string _name; 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    string IF1.Name 
    { 
     get { return _name; } 
     set { _name = value; OnPropertyChanged(); } 
    } 

} 

public interface IF1 
{ 
    string Name { set; get; } 
} 

E quando si scrive una lista nella pagina di

public ObservableCollection<Foo> Foo { set; get; } = new ObservableCollection<Foo>() 
    { 
     new Foo("jlong"){} 
    }; 

Come si può legare in XAML?

Trovo un modo per legarlo. Dovresti usare x:bind e usare Path=(name:interface.xx) per legarlo in xaml.

<ListView ItemsSource="{x:Bind Foo}"> 
     <ListView.ItemTemplate> 
      <DataTemplate x:DataType="local:Foo"> 
       <TextBlock Text="x:Bind Path=(local:IFoo.Name)"></TextBlock> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
    </ListView> 
Problemi correlati