UWP XAML x:Bind 无法识别继承的接口
UWP XAML x:Bind inherited interfaces are not recognized
在 UWP XAML 应用程序中使用 x: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; }
}
在页面 class 中,我们有以下内容:
public partial class MainPage : Page
{
public ISubInterface TheObject = new ImplementationClass { A = "1", B = "2" };
//All the rest goes here
}
在 MainPage XAML 中,我们有以下代码段:
<TextBlock Text={x:Bind Path=TheObject.A}></TextBlock>
这会导致以下编译器错误:
XamlCompiler 错误 WMC1110:绑定路径 'A' 无效:无法在类型 'ISubInterface'
上找到 属性 'A'
但是以下内容确实有效:
<TextBlock Text={x:Bind Path=TheObject.B}></TextBlock>
有人知道编译器无法识别继承的接口属性是否是 UWP XAML 平台的已知限制吗?
或者这应该被认为是一个错误?
有任何已知的解决方法吗?
非常感谢您的帮助。
提前致谢!
是的,经过一些测试和研究,使用 X:Bind.
时,编译器似乎无法识别继承的接口属性
作为解决方法,我们可以使用传统的绑定而不是 X:Bind,如下所示:
在.xaml:
<Grid Name="MyRootGrid">
<TextBlock Text="{Binding A}"></TextBlock>
</Grid>
在xaml.cs中:
MyGrid.DataContext = TheObject;
如果写一个classFoo继承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 中绑定它?
我找到了绑定它的方法。您应该使用 x:bind
并使用 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>
通过文件顶部的 xmlns 添加基础 class 的命名空间:
xmlns:base="using:Namespace.Of.Base.Class"
在 UWP XAML 应用程序中使用 x: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; }
}
在页面 class 中,我们有以下内容:
public partial class MainPage : Page
{
public ISubInterface TheObject = new ImplementationClass { A = "1", B = "2" };
//All the rest goes here
}
在 MainPage XAML 中,我们有以下代码段:
<TextBlock Text={x:Bind Path=TheObject.A}></TextBlock>
这会导致以下编译器错误: XamlCompiler 错误 WMC1110:绑定路径 'A' 无效:无法在类型 'ISubInterface'
上找到 属性 'A'但是以下内容确实有效:
<TextBlock Text={x:Bind Path=TheObject.B}></TextBlock>
有人知道编译器无法识别继承的接口属性是否是 UWP XAML 平台的已知限制吗? 或者这应该被认为是一个错误? 有任何已知的解决方法吗?
非常感谢您的帮助。 提前致谢!
是的,经过一些测试和研究,使用 X:Bind.
时,编译器似乎无法识别继承的接口属性作为解决方法,我们可以使用传统的绑定而不是 X:Bind,如下所示:
在.xaml:
<Grid Name="MyRootGrid">
<TextBlock Text="{Binding A}"></TextBlock>
</Grid>
在xaml.cs中:
MyGrid.DataContext = TheObject;
如果写一个classFoo继承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 中绑定它?
我找到了绑定它的方法。您应该使用 x:bind
并使用 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>
通过文件顶部的 xmlns 添加基础 class 的命名空间:
xmlns:base="using:Namespace.Of.Base.Class"