Xamarin.UWP 自定义 ViewCell 的绑定有问题
Xamarin.UWP Custom ViewCell has problems with the bindings
我已经创建了一个自定义的 ViewCell,它应该在我的 ListView 中使用
相同的代码适用于 Android 但不适用于 UWP(Windows Phone 和 Windows 桌面类似)。
该项目是 Xamarin Forms。
当我在 ListView 中使用它时...我只能看到空白单元格。
<?xml version="1.0" encoding="UTF-8"?>
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="AAA.Extensions.AttributeViewCell"
Tapped="AttributeViewCell_OnTapped"
>
<Grid
x:Name="AttributeGrid"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackLayout
Grid.Column="0"
>
<Label
Text="{Binding Code}"
TextColor="#000000"
/>
<Label
Text="{Binding Description}"
TextColor="#000000"
/>
</StackLayout>
<StackLayout
Grid.Column="1"
x:Name="DynamicContentStackLayout"
>
</StackLayout>
</Grid>
我的代码隐藏
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class AttributeViewCell : ViewCell
{
#region Bindable Properties
public static readonly BindableProperty CodeProperty = BindableProperty.Create(nameof(Code),typeof(string),typeof(AttributeViewCell), defaultBindingMode:BindingMode.TwoWay);
public static readonly BindableProperty DescriptionProperty = BindableProperty.Create(nameof(Description), typeof(string), typeof(AttributeViewCell), defaultBindingMode:BindingMode.TwoWay);
#endregion
#region Properties
/// <summary>
/// Attribute Code
/// </summary>
public string Code
{
get => (string) GetValue(CodeProperty);
set => SetValue(CodeProperty,value);
}
/// <summary>
/// Attribute's description
/// </summary>
public string Description
{
get => (string) GetValue(DescriptionProperty);
set => SetValue(DescriptionProperty, value);
}
#endregion
public AttributeViewCell()
{
InitializeComponent ();
this.BindingContext = this;
}
private void AttributeViewCell_OnTapped(object sender, EventArgs e)
{
// I CAN SEE BINDINGS here...
}
}
绑定是在整个 ViewModel 中完成的
POCO 如下所示
public class Attribute
{
public string Code { get; set; }
public string Description { get; set; }
}
虚拟机
public class ProductDetailsPageViewModel:BaseViewModel
{
#region 字段
私人只读AnonymousCheckerService _anonymousCheckerService;
私有列表 _attributes;
#endregion
#region Properties
public List<Attribute> Attributes
{
get => _attributes;
set
{
_attributes = value;
OnPropertyChanged();
}
}
#endregion
//basic ctor
public ProductDetailsPageViewModel()
{
_aaa= new aaa();
Attributes = _aaa.GetInfo("123").Attributes;
}
}
最后,ListView
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:extensions="clr-namespace:AnonymousCheckerApp.Extensions"
x:Class="AnonymousCheckerApp.Views.ProductDetailsPage">
<StackLayout>
<ListView
ItemsSource="{Binding Attributes}"
>
<ListView.ItemTemplate>
<DataTemplate>
<extensions:AttributeViewCell
Code="{Binding Code}"
Description="{Binding Description}"
AttributeDetails="{Binding AttributeDetails}"
/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
and it's codebehind
public ProductDetailsPage()
{
var vm = new ProductDetailsPageViewModel();
this.BindingContext = vm;
InitializeComponent ();
}
我已经在 viewcell 上附加了一个 Tapped 事件...我可以看到绑定...
编辑 1
我已经注释掉了 Grid 代码,因为我发现其他一些开发人员在绑定 Grid
元素中堆叠的元素时遇到问题...
仍然无法正常工作,奇怪的是它正确 "parses" XAML 元素但它无法进行绑定....我做错了什么?
这是它在 Android 上的样子
我已经测试了你的代码并重现了你的问题。这一行 this.BindingContext = this;
是不必要的。因为AttributeViewCell
继承了ViewCell,直接在ListViewDataTemplate
中使用即可。所以请从 AttributeViewCell
构造函数中删除以下行代码。
this.BindingContext = this;
我已经创建了一个自定义的 ViewCell,它应该在我的 ListView 中使用 相同的代码适用于 Android 但不适用于 UWP(Windows Phone 和 Windows 桌面类似)。
该项目是 Xamarin Forms。
当我在 ListView 中使用它时...我只能看到空白单元格。
<?xml version="1.0" encoding="UTF-8"?>
<ViewCell xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="AAA.Extensions.AttributeViewCell"
Tapped="AttributeViewCell_OnTapped"
>
<Grid
x:Name="AttributeGrid"
>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<StackLayout
Grid.Column="0"
>
<Label
Text="{Binding Code}"
TextColor="#000000"
/>
<Label
Text="{Binding Description}"
TextColor="#000000"
/>
</StackLayout>
<StackLayout
Grid.Column="1"
x:Name="DynamicContentStackLayout"
>
</StackLayout>
</Grid>
我的代码隐藏
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class AttributeViewCell : ViewCell
{
#region Bindable Properties
public static readonly BindableProperty CodeProperty = BindableProperty.Create(nameof(Code),typeof(string),typeof(AttributeViewCell), defaultBindingMode:BindingMode.TwoWay);
public static readonly BindableProperty DescriptionProperty = BindableProperty.Create(nameof(Description), typeof(string), typeof(AttributeViewCell), defaultBindingMode:BindingMode.TwoWay);
#endregion
#region Properties
/// <summary>
/// Attribute Code
/// </summary>
public string Code
{
get => (string) GetValue(CodeProperty);
set => SetValue(CodeProperty,value);
}
/// <summary>
/// Attribute's description
/// </summary>
public string Description
{
get => (string) GetValue(DescriptionProperty);
set => SetValue(DescriptionProperty, value);
}
#endregion
public AttributeViewCell()
{
InitializeComponent ();
this.BindingContext = this;
}
private void AttributeViewCell_OnTapped(object sender, EventArgs e)
{
// I CAN SEE BINDINGS here...
}
}
绑定是在整个 ViewModel 中完成的 POCO 如下所示
public class Attribute
{
public string Code { get; set; }
public string Description { get; set; }
}
虚拟机 public class ProductDetailsPageViewModel:BaseViewModel { #region 字段 私人只读AnonymousCheckerService _anonymousCheckerService; 私有列表 _attributes;
#endregion
#region Properties
public List<Attribute> Attributes
{
get => _attributes;
set
{
_attributes = value;
OnPropertyChanged();
}
}
#endregion
//basic ctor
public ProductDetailsPageViewModel()
{
_aaa= new aaa();
Attributes = _aaa.GetInfo("123").Attributes;
}
}
最后,ListView
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:extensions="clr-namespace:AnonymousCheckerApp.Extensions"
x:Class="AnonymousCheckerApp.Views.ProductDetailsPage">
<StackLayout>
<ListView
ItemsSource="{Binding Attributes}"
>
<ListView.ItemTemplate>
<DataTemplate>
<extensions:AttributeViewCell
Code="{Binding Code}"
Description="{Binding Description}"
AttributeDetails="{Binding AttributeDetails}"
/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
and it's codebehind
public ProductDetailsPage()
{
var vm = new ProductDetailsPageViewModel();
this.BindingContext = vm;
InitializeComponent ();
}
我已经在 viewcell 上附加了一个 Tapped 事件...我可以看到绑定...
编辑 1
我已经注释掉了 Grid 代码,因为我发现其他一些开发人员在绑定 Grid
元素中堆叠的元素时遇到问题...
仍然无法正常工作,奇怪的是它正确 "parses" XAML 元素但它无法进行绑定....我做错了什么?
这是它在 Android 上的样子
我已经测试了你的代码并重现了你的问题。这一行 this.BindingContext = this;
是不必要的。因为AttributeViewCell
继承了ViewCell,直接在ListViewDataTemplate
中使用即可。所以请从 AttributeViewCell
构造函数中删除以下行代码。
this.BindingContext = this;