当前位置: 首页 > 知识库问答 >
问题:

MAUI:ListView与自定义ViewCell绑定

姜嘉赐
2023-03-14

我使用FreshMvvm在Windows上开发和运行MAUI项目。

但我的ListView和自定义模板存在一些绑定问题。

以下是我的代码:

型号:

public class BaseModel
{
    public string Code{ get; set; }
}

public class NameModel: BaseModel
{
    public string Name{ get; set; }
}

视图模型

public class MainPageModel : FreshBasePageModel
{
    private readonly IApiService _apiService;
    private List<NameModel> _nameModelList;

    public List<NameModel> NameModelList
    {
        get => _nameModelList;
        private set 
        {
            _nameModelList= value;

            RaisePropertyChanged(nameof(NameModelList));
        }
    }

    public MainPageModel(IApiService apiService)
    {
        _apiService = apiService;
    }

    protected override void ViewIsAppearing(object sender, EventArgs e)
    {
        base.ViewIsAppearing(sender, e);

        Task.Run(() => GetNameData());
    }

    private async Task GetNameData()
    {
        var result = await _apiService.GetNameData();
        NameModelList= result.GetRange(1, 10);
    }
}

我创建了一个列表,并使用api服务来获取名称模型列表数据。如果api服务获得数据,NameModelList将被更新。

NameModelList是将在Listview上绑定的属性。物品来源

主页。xmal:

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:MyNamespace.ViewCells.CustomListViewCell"
             x:Class="MyNamespace.Pages.MainPage"
             BackgroundColor="{DynamicResource SecondaryColor}">

    <Grid RowSpacing="25" 
          RowDefinitions="Auto" 
          VerticalOptions="FillAndExpand"
          HorizontalOptions="FillAndExpand">

        <ListView 
                x:Name="MyListView"
                ItemsSource="{Binding NameModelList}"
                Grid.Row="0"
                WidthRequest="800"
                HeightRequest="800"
                BackgroundColor="Gray"
                VerticalOptions="FillAndExpand"
                HorizontalOptions="FillAndExpand">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <local:MyCustomViewCell/>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>

    </Grid>
</ContentPage>

自定义ViewCell(.xml):

<ViewCell xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
          xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
          x:Class="MyNamespace.ViewCells.CustomListViewCell.MyCustomViewCell">

    <Grid RowSpacing="100"  WidthRequest="100" HeightRequest="100">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100*" />
        </Grid.ColumnDefinitions>
        <StackLayout
            GridLayout.Row="0"
            GridLayout.Column="0">
            <Label
                Text="{Binding Code}"
                FontSize="30"/>
            <Label
                Text="{Binding Name}"
                FontSize="30"/>
        </StackLayout>
    </Grid>
</ViewCell>

自定义ViewCell(.cs)

public partial class MyCustomViewCell: ViewCell
{
    public static readonly BindableProperty CodeProperty = 
        BindableProperty.Create("Code", typeof(string), typeof(MyCustomViewCell), "");

    public string Code
    {
        get { return (string)GetValue(CodeProperty); }
        set { SetValue(CodeProperty, value); }
    }

    public static readonly BindableProperty NameProperty =
        BindableProperty.Create("Name", typeof(string), typeof(MyCustomViewCell), "");

    public string Name
    {
        get { return (string)GetValue(NameProperty); }
        set { SetValue(NameProperty, value); }
    }
}

我定义了一个自定义的ViewCell文件,并将这个ViewCell放在主页的Listview中。

现在我的问题是我的Listview无法成功显示数据。

我确信NameModelList有值,并且其计数大于1。

但我什么也看不见。

输出日志没有错误,MyCustomViewCell中的断点。cs永远不会触发。

所以我想我有一些绑定问题,但我找不到。

共有1个答案

东方森
2023-03-14

为了搞清楚这个问题,我把你的代码放在一个项目中,这样我就可以玩一会儿了。你可以在这里找到回购协议。不是在这里粗鲁或其他什么,但可能是一个好主意,下一个问题你自己来做,这将有助于加快速度:)

无论如何,问题要微妙得多。因为您在布局中使用XAML,所以必须在构造函数中调用InitializeComponent。因此,将它添加到您的MyCustomViewCell中,就可以工作了:

public MyCustomViewCell()
{
    InitializeComponent();
}
 类似资料:
  • 自定义绑定(Custom Binding)允许我们通过代码实现自定义绑定规则,从而完成更高级的业务需求。 示例代码 //.js片段 justep.Bind.bindingHandlers.yourBindingName = { init: function (element, valueAccessor, allBindings, viewModel, bindingContext) {

  • 问题内容: 我想使用JAXB 2.1 XJC从xsd生成Java代码。我提供了xsd模式,无法更改。我想在从xml架构生成Java类时使用 xjc:simple 模式。 在xsd中有一些元素: 如此处所述:http : //jaxb.java.net/guide/Mapping_of__xs_any___.html我希望这些元素将被绑定到: 但是当我使用简单绑定模式 xjc:simple时, 我有

  • 问题内容: 如果我有一个没有模板的AngularJS指令,并且希望它在当前作用域上设置一个属性,那么最好的方法是什么? 例如,计算按钮点击次数的指令: 使用伪指令将点击计数分配给双向属性中的表达式: 有一个更好的方法吗?从我所读的内容来看,孤立的作用域会过大,但是我需要一个子作用域吗?除了使用以外,还有没有更干净的方法可以写回指令属性中定义的范围变量。我只是觉得我很难过。 这里有完整的柱塞。 问题

  • 问题内容: 我正在尝试在Java GUI上实现JTable,该JTable可以使用文件中的值填充自身,并允许用户对各种单元格进行修改。由于我在Netbeans IDE中使用GUI编辑器,因此我的第一个直觉是将JTable从面板添加到表单中。但是,我很快意识到我不能在表中添加超过100行(对于我的应用程序,我需要大约500行以上)。另外,在寻找解决方案时,我注意到很多人说使用Custom Table

  • 问题内容: 我是否可以使用标准方法将自己的自定义对象添加到Map,然后将其正确编组到MapMessage中?当前,我收到无效对象类型消息。我注意到WebSphere有解决方案,但是我正在寻找不受特定AS约束的东西,如果没有这种方法,也许JBoss支持的东西会起作用。 如何在WebSphere中进行操作:http : //publib.boulder.ibm.com/infocenter/dmndh

  • 我正在为log4j2编写一个自定义包装器。使用https://logging.apache.org/log4j/2.x/manual/customloglevels.html#Customlogggers 要求是根据要记录的对象类型选择追加器。我想的方法是扩展log4j2记录器并覆盖log方法(如info),在这些方法中检查对象类型并调用所需的appender。 现在我想让我的应用程序使用slf4