XAML MAUI在视图模型列表中找不到属性

q1qsirdb  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(198)

我有一个简单的视图模型,其中一个属性包含模型,另一个属性包含模型列表。
我能够毫无问题地绑定“Test”模型的属性,但是我无法让XAML识别“ListModel”包含一个具有自己属性的列表。我已经查看了几个示例,了解如何设置视图模型并在将列表绑定到视图之前正确初始化列表,虽然XAML理解“ListModel”是一个属性,我不能让它识别出这是一个列表,因此它不会编译,这样我至少可以看看它是否不是智能感知,可能会因为任何原因而失败。
这是所讨论的视图模型,其列表名为“ListModel”

public class TestViewModel
{        
    public TestModel Test { get; } = new TestModel();
    public List<TestListModel> ListModel { get; set; }

    public TestViewModel()
    {
        Initialize();
    }

    public void Initialize()
    {
        ListModel = new List<TestListModel>();
        ListModel.Add(new TestListModel
        {
            ListProp1 = "First",
            ListProp2 = "Second",
            ListProp3 = "Third"
        });
    }     
}

这是要放入列表中的模型。视图似乎看不到这些属性。

public class TestListModel
    {        
        public string ListProp1 { get; set; }
        public string ListProp2 { get; set; }
        public string ListProp3 { get; set; }
    }

这是我的XAML当前。

<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="MauiApp1.MainPage"
             xmlns:local="clr-namespace:ViewModels" 
             x:DataType="local:TestViewModel"
    >

    <ScrollView>

        <VerticalStackLayout 
            Spacing="25" 
            Padding="30,0" 
            VerticalOptions="Center">          

            <!--This works-->
            <Entry Text="{Binding Test.Property1}"/>
            <Entry Text="{Binding Test.Property2}"/>
            <Entry Text="{Binding Test.Property3}"/>            
            
            <!--This does not work-->
            <ListView
                ItemsSource="{Binding ListModel}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <Label Text="{Binding ListProp1}"/>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>    
            </ListView>    
        </VerticalStackLayout>    
    </ScrollView>
</ContentPage>
qfe3c7zg

qfe3c7zg1#

对于任何无意中发现这个的人:Jason在评论中已经回答了这个问题,修复方法只是从XAML的顶部删除x:DataType,尽管我没有删除“xmlns:local”。
我拥有的是一个视图模型,其中包含不止一个模型,这似乎在删除x:DataType时扰乱了智能感知。删除它最初会阻止应用程序编译,因为它找不到我在XAML中拥有的属性。一旦我清理并重建了解决方案,它就可以顺利编译和工作。

nqwrtyyt

nqwrtyyt2#

viewviewmodel通常通过XAML中定义的数据绑定连接,视图的BindingContext通常是viewmodel的示例,所以我认为您忘记了用BindingContext连接这两个元素。

视图背后的代码:

public partial class MainPage : ContentPage
{

    TestViewModel tv = new TestViewModel();
    public MainPage()
    {
        InitializeComponent();
        BindingContext = tv;
    }
}

Xaml中的代码:

<ScrollView>
        <VerticalStackLayout 
            Spacing="25" 
            Padding="30,0" 
            VerticalOptions="Center">

            <!--This works-->
            <Entry Text="{Binding Test.Property1}"/>
            <Entry Text="{Binding Test.Property2}"/>
            <Entry Text="{Binding Test.Property3}"/>

            <!--This works too-->
            <ListView
                HasUnevenRows="True"
                ItemsSource="{Binding ListModel}">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <ViewCell>
                            <VerticalStackLayout>
                                <Label Text="{Binding ListProp1}"/>
                                <Label Text="{Binding ListProp2}"/>
                                <Label Text="{Binding ListProp3}"/>
                            </VerticalStackLayout>
                        </ViewCell>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </VerticalStackLayout>
    </ScrollView>

结果:

Reference link .

tuwxkamq

tuwxkamq3#

我能够修复这个错误,同时通过使ItemSource绑定到一个带有私有支持字段的列表来保持编译后的绑定。看起来编译器在没有私有属性的情况下无法正确解析列表。在我添加listModel之后,它被编译了。所以问题似乎是setter丢失了。

private List<TestListModel> listModel;
    public List<TestListModel> ListModel { get => listModel; set => listModel = value; }

相关问题