【问题标题】:MAUI not finding property in VIew Model ListMAUI 未在视图模型列表中找到属性
【发布时间】:2023-01-24 16:49:33
【问题描述】:

我有一个简单的视图模型,其中一个属性包含一个模型,另一个属性包含一个模型列表。

我能够毫无问题地绑定“测试”模型的属性,但我无法让 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>
 

【问题讨论】:

  • 摆脱x:DataType
  • 我删除了 XAML 的那部分,所有其他绑定都损坏了。
  • “坏了”不是对问题的有用描述。您是否收到编译器错误、运行时异常、崩溃等? DataType 是一个帮助器,它允许 VS 为你的 XAML 绑定提供 Intellisense。这不应该是编译/运行时的问题,只是设计时的问题。我从不在我的 XAML 中使用它。

标签: c# xaml maui


【解决方案1】:

对于遇到此问题的任何人:cmets 中的 Jason 已经回答了这个问题。修复只是从 XAML 的顶部删除 x:DataType,但我没有从中删除“xmlns:local”。

我拥有的是一个视图模型,其中包含多个模型,这似乎在删除 x:DataType 时扰乱了智能感知。删除它最初会阻止应用程序编译,因为它找不到我在 XAML 中拥有的属性。一旦我清理并重建了解决方案,它就可以顺利编译和运行。

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 能否请您帮忙确认解决方案是否对您的问题有帮助?如果有帮助,请accept it✅作为答案,因为它对面临同样问题的其他人有帮助。提前致谢!
    【解决方案3】:

    通过使 ItemSource 绑定到具有私有支持字段的 List,我能够修复错误,同时保持已编译的绑定就位。如果没有私有属性,编译器似乎无法正确解析列表。在我添加 listModel 后它编译了。

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

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 1970-01-01
      • 2022-10-24
      • 2022-01-09
      • 2023-01-14
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      相关资源
      最近更新 更多