2015-09-04 9 views
9

Podczas korzystania X: Bind w aplikacji UWP XAML rozważyć następujące:UWP XAML X: Bind dziedziczone interfejsy nie są rozpoznawane

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

w klasie strony mamy następujący:

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

w mainpage XAML mamy następujący fragment:

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

co powoduje następujący błąd kompilatora: XamlCompiler błąd WMC1110: Nieprawidłowy wiązania ścieżki „A”: właściwość „A” nie można znaleźć w rodzaju „ISubInterface”

Poniższa praca ma jednak:

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

Czy ktoś wie, czy jest to znane ograniczenia platformy UWAM XAML, która odziedziczyła właściwości interfejsu, nie są rozpoznawane przez kompilator? Czy powinien to być uważany za błąd? Czy są znane sposoby obejścia tego problemu?

Pomoc jest bardzo doceniana. Z góry dziękuję!

+2

można próbować określić jako '' TheObject' IBaseInterface' zamiast 'ISubInterface' i zobaczyć, czy to kompilator akceptuje' TheObject.A'? – dognose

Odpowiedz

7

Tak, po wykonaniu niektórych testów i ponownym wybraniu wydaje się, że odziedziczone właściwości interfejsu nie są rozpoznawane przez kompilator podczas korzystania z X: Bind.

Jako obejście możemy użyć tradycyjnej oprawy zamiast X: Bind, jak następuje:

W .xaml:

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

W xaml.cs:

MyGrid.DataContext = TheObject; 
+0

Dzięki za próbę i dojście do tego samego wniosku co ja. Przesłałem błąd przez Connect: https://connect.microsoft.com/VisualStudio/feedback/details/1770944 –

0

Jeśli napiszesz klasę Foo odziedziczyłeś 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; } 
} 

A kiedy piszesz listę w stronę

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

Jak można powiązać go w XAML?

Znajduję sposób na powiązanie go. Powinieneś użyć x:bind i użyć Path=(name:interface.xx), aby powiązać go w 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> 
Powiązane problemy