2015-09-04 15 views
9

Khi sử dụng x: Ràng buộc trong một ứng dụng UWP XAML xem xét như sau:UWP XAML x: Bind thừa hưởng giao diện không được công nhận

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

Trong trang lớp, chúng tôi đã điều sau đây:

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

trong mainpage XAML chúng ta có đoạn mã sau:

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

nào gây ra lỗi biên dịch sau: XamlCompiler lỗi WMC1110: không hợp lệ ràng buộc con đường 'A': Sở hữu 'A' không thể được tìm thấy trên gõ 'ISubInterface'

Sau đây không làm việc tuy nhiên:

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

Có ai biết nếu nó là một giới hạn được biết đến của nền tảng XWL UWP thừa hưởng giao diện thuộc tính không được công nhận bởi trình biên dịch? Hoặc điều này có nên được coi là lỗi không? Có cách giải quyết nào không?

Trợ giúp được đánh giá cao. Cảm ơn bạn trước!

+2

Bạn có thể cố gắng xác định 'TheObject' là' IBaseInterface' thay vì 'ISubInterface' và xem trình biên dịch có chấp nhận' TheObject.A' không? – dognose

Trả lời

7

Có, sau khi thực hiện một số kiểm tra và nghiên cứu, có vẻ như các thuộc tính giao diện kế thừa không được trình biên dịch thừa nhận khi sử dụng X: Bind.

Là một workaround chúng ta có thể sử dụng Binding truyền thống thay vì X: Ràng buộc như sau:

Trong .xaml:

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

Trong xaml.cs:

MyGrid.DataContext = TheObject; 
+0

Cảm ơn bạn đã cố gắng và đến cùng một kết luận như tôi đã làm. Tôi đã gửi lỗi thông qua Connect: https://connect.microsoft.com/VisualStudio/feedback/details/1770944 –

0

Nếu bạn viết IFoo lớp Foo kế thừa.

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

Và khi bạn viết một danh sách trong trang

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

Làm thế nào bạn có thể gắn nó trong XAML?

Tôi tìm cách liên kết nó. Bạn nên sử dụng x:bind và sử dụng Path=(name:interface.xx) để liên kết nó trong 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> 
Các vấn đề liên quan