我现在正在学习.NET MAUI,我遇到了一个数据绑定的问题。我已经阅读了Microsoft文档中关于数据绑定的部分,但我仍然不知道为什么它不起作用。
我可以显示按钮和第二个标签。但是,一旦我将它绑定到视图模型上的属性,它就不会显示。如果我使用绑定。它显示MauiTestApp. ViewModel. MainViewModel。我可以从中收集到的是Data上下文是正确的,我应该能够访问属性的上下文。
以下是我的View Model:
using MauiTestApp.Model;
using System.Collections.ObjectModel;
namespace MauiTestApp.ViewModel
{
public partial class MainViewModel : ObservableObject
{
public ObservableCollection<Monkey> Monkeys = new ObservableCollection<Monkey>();
public String s = "Hello world";
public MainViewModel()
{
Monkeys.Add(new Monkey("Bob", 20));
Monkeys.Add(new Monkey("Steve", 10));
Monkeys.Add(new Monkey("Joey", 14));
}
public void AddMonkey()
{
Monkeys.Add(new Monkey("Harry", 23));
}
}
}
下面是XAML
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:MauiTestApp"
xmlns:viewModel="clr-namespace:MauiTestApp.ViewModel"
xmlns:model="clr-namespace:MauiTestApp.Model"
x:Class="MauiTestApp.MainPage">
<ContentPage.BindingContext>
<viewModel:MainViewModel/>
</ContentPage.BindingContext>
<ScrollView>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
<RowDefinition Height="30"></RowDefinition>
</Grid.RowDefinitions>
<Button Grid.Row="0" Text="Press me" Pressed="Button_Pressed"></Button>
<Label Grid.Row="1" Text="{Binding s}" TextColor="Purple" ></Label>
<Label Grid.Row="2" Text="Hello world" TextColor="Purple"></Label>
</ScrollView>
</ContentPage>
下面的XAML代码:
namespace MauiTestApp
{
public partial class MainPage : ContentPage
{
public MainViewModel viewModel;
public MainPage(MainViewModel vm)
{
InitializeComponent();
viewModel = vm;
}
private void Button_Pressed(object sender, EventArgs e)
{
viewModel.AddMonkey();
}
}
}
如果这是一个基本的问题,我很抱歉,但我完全被困在这一点上。
谢谢你的帮助!!!
2条答案
按热度按时间mlnl4t2r1#
在标签中看不到任何文本的原因是因为它不是属性。您需要使用MVVM工具包来使您的生活更轻松。在这里阅读更多
所以ViewModel中的绑定应该如下所示
不是说它是一个带有小s的私有字段。通过ObservableProperty,它被生成为一个公共的并使用大写字母S分配的适当Property。重要的是总是这样做。永远不要使用私有字段。总是财产。
现在有很多问题与您的代码一般,所以如果你不介意,我会给予你一个可能的解决方案,我可以从你的代码翻译。我希望能帮上忙。
首先,完整的视图模型看起来像这样。注意带有
[RelayCommand]
的方法。它将接受您的方法并将其转换为可绑定的命令。它还遵循命名约定。因此,它永远不会以命令结束。要绑定到它,我们在视图中添加Command。通过这样做,我们将视图模型从所有引用解耦到MUAI引用。如果我们看看你的观点。它可以看起来像这样,显示一个列表的钱和你的按钮。
代码落后。永远不要忘记绑定到
BindingContext
,无论是在这里还是像你一样,在xaml中。如果不是这样,你的观点将不会绑定到任何东西。mfuanj7w2#
只能绑定公共属性
这不是一个属性
这是