2015-09-04 1 views
9

При использовании х: Bind в приложении UWP XAML рассмотрим следующее:UWP XAML х: Bind унаследовали интерфейсы не распознаются

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

В классе Page мы имеем следующее:

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

В MainPage XAML мы имеем следующий фрагмент кода:

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

Что вызывает следующую ошибку компилятора: XamlCompiler ошибка WMC1110: Invalid привязки путь 'A': Свойство 'A' не может быть найден по типу '' ISubInterface

Следующая делает работу, однако:

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

Кто-нибудь знает, если это известное ограничение платформы UWP XAML, которое унаследовало свойства интерфейса, не распознается компилятором? Или это должно считаться ошибкой? Есть ли какие-нибудь известные способы обхода?

справка приветствуется. Спасибо заранее!

+2

Вы можете попытаться определить 'TheObject' как' IBaseInterface', а не 'ISubInterface' и посмотреть, если компилятор затем принимает' TheObject.A'? – dognose

ответ

7

Да, после выполнения какого-либо теста и повторного анализа кажется, что унаследованные свойства интерфейса не распознаются компилятором при использовании X: Bind.

В качестве временного решения можно использовать традиционный Binding вместо X: Bind как следующее:

В .xaml:

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

В xaml.cs:

MyGrid.DataContext = TheObject; 
+0

Спасибо, что попытался и пришел к тому же выводу, что и я. Я отправил ошибку через Connect: https://connect.microsoft.com/VisualStudio/feedback/details/1770944 –

0

Если вы напишете класс Foo, унаследованный 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; } 
} 

И когда вы пишете список в странице

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

Как вы можете связать это в XAML?

Я нахожу способ связать его. Вы должны использовать и использовать Path=(name:interface.xx), чтобы связать его в 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> 
Смежные вопросы