Xamarin.UWP 自定义 ViewCell 存在绑定问题

Posted

技术标签:

【中文标题】Xamarin.UWP 自定义 ViewCell 存在绑定问题【英文标题】:Xamarin.UWP Custom ViewCell has problems with the bindings 【发布时间】:2017-11-21 00:24:38 【问题描述】:

我创建了一个应该在我的 ListView 中使用的自定义 ViewCell 相同的代码适用于 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; 
    

虚拟机 公共类 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 元素中的元素时遇到了问题... 仍然无法正常工作,奇怪的是它正确“解析”了 XAML 元素,但无法进行绑定....我做错了什么?

这就是它在 Android 上的样子

【问题讨论】:

这不是一个不同的问题,也许文本出于某种原因是白色的?您能否将TextColor 设置为红色或其他任何内容以排除它:) 我已经更新了主线程...仍然无法正常工作,如果我将 Text=Binding 替换为一些硬编码值,它将呈现。 【参考方案1】:

我已经测试了您的代码并重现了您的问题。这行this.BindingContext = this; 是不必要的。因为AttributeViewCell继承了ViewCell,所以可以直接在ListView中使用DataTemplate。所以请从AttributeViewCell构造函数中删除以下行代码。

 this.BindingContext = this;

【讨论】:

以上是关于Xamarin.UWP 自定义 ViewCell 存在绑定问题的主要内容,如果未能解决你的问题,请参考以下文章

[xamarin][uwp][custom renderer] 自定义渲染器 pcl 库未在发布模式下加载

如何在 Xamarin.UWP 应用程序中实现 LongPress?

如何更改 Xamarin.UWP 中 TableView TableSection 中的 TextSize 和大小写

如何检测 xamarin UWP 应用程序中标签元素的文本值更改?

如何从 Xamarin Forms 中的自定义 ViewCell 获取 ListView 项目索引?

即使内容和代码最少,扩展 viewcell 的自定义控件也会引发 System.InvalidCastException