将MAUI下的界面更新为MVVM时出现问题

问题描述 投票:0回答:1

我有两个课程可以为我建造一棵树

 public partial class Noeud : ObservableValidator
{
    [ObservableProperty]
    [Required(ErrorMessage = "Le nom est obligatoire.")]
    [StringLength(maximumLength: 25, MinimumLength = 5, ErrorMessage = "Le nom ne doit avoir une longueur comprise entre 5 et 25 caractères.")]
    String name;

    [ObservableProperty]
    [StringLength(maximumLength:255, ErrorMessage = "La description ne doit pas dépasser 255 caractères.")]
    String? description;

    public Guid IdNoeud { get; }

    [ObservableProperty]
    Noeud? parent;

    public Ressource? Ressource { get; set; }

    //resultat obtenu sur 100 soit le résultat d'une ressource soit la somme des résultats des ressources des fils
    [Range(0, 100, ErrorMessage = "Le résultat ne doit être compris entre 0 et 100.")]
    public int? result { get; set; }
    public ObservableCollection<Noeud> Noeuds { get; } = new ObservableCollection<Noeud>();

    public Noeud(Guid guidnoeud, String name, string description, Noeud? parent = null,  Ressource? ressource=null)
    {
        Name = name;
        Description = description;
        Parent = parent;
        IdNoeud = guidnoeud;
        if (ressource != null)
        {
            Ressource = ressource;
        }
    }
}

public partial class Ressource : ObservableValidator
{
    
    public int? type { get; set; }

    [Url(ErrorMessage ="L'entrée doit être une URL valide.")]
    public String? ressource { get; set; }

    //description du coaching
    [StringLength(255, ErrorMessage = "La description de la méthode d'acquisition de la compétence ne doit pas dépasser 255 caractères.")]
    public String? coaching { get; set; }

    //description de la compétence recherchée

    [StringLength(50, ErrorMessage = "La description de la compétence ne doit pas dépasser 50 caractères.")]
    public String? competence { get; set; }
    //Code de la compétences suivant un référentiel propre
    [StringLength(15, ErrorMessage = "Le code de la référence à la compétence ne doit pas dépaser 15 caractères")]
    public  String? codeRefCompetence { get; set; }
    //code de l'objectif dans eda
    [StringLength(15, ErrorMessage = "Le code de l'objectif LMS ne doit pas dépasser 20 caractères.")]
    public  String? codeObjectif { get; set; }

    [Range(0,100, ErrorMessage ="Le score doit être compris entre 0 et 100.")]
    public int? Score { get; set; }
}

我有一个用 MVVM 开发的页面,它基于此视图模型显示数据

    public partial class TreeViewPageViewModel : ObservableObject
    {
        public ObservableCollection<Noeud> Noeuds { get; } = new ObservableCollection<Noeud>();
        ....
        [RelayCommand]
        public async Task AddItem()
        {
        ..
        if (action == "- Une Action")
        {
            Noeud NewNoeud = new Noeud(Guid.NewGuid(), "", "", SelectedItem, null);
            selectedItem.Noeuds.Add(NewNoeud);
    
            await Page.Navigation.PushAsync(new EditTreeAction(ref NewNoeud));
    
        }
        else
        {
            Noeud NewNoeud = new Noeud(Guid.NewGuid(), "", "", SelectedItem, new Ressource());
    
            await Page.Navigation.PushAsync(new EditTreeRessource(ref NewNoeud));
    
            selectedItem.Noeuds.Add(NewNoeud);
        }
...

当我更新名称和节点描述时,我的 .xaml 会更新为正确的值。

<Label Text="{Binding Description}"  LineBreakMode="WordWrap" Margin="0"/>
<Label Text="{Binding Parent.Name}"  LineBreakMode="WordWrap" Margin="0" TextColor="red"/>

当我更新资源数据时,它会添加到节点,但不会显示在 .xaml 中

   <Label Text="Description de compétence à obtenir :"  LineBreakMode="WordWrap" Margin="0,6,0,0" FontAttributes="Bold" FontSize="Caption"/>
    <Label Text="{Binding Ressource.competence}"  LineBreakMode="WordWrap" Margin="0"/>

另一方面,如果在调试模式下我注释掉这些行并取消注释它们,那么就会出现值。

我尝试了很多事情: 将资源作为可观察的 => 即使在调试中也不再显示 将资源类的属性设置为可观察 => 这不起作用

你知道该怎么做吗?

提前致谢

class mvvm observable maui
1个回答
0
投票

RessourceRessource.competence 应该都是可观察的。

所以修改Noeud类中的代码:

public Ressource? Ressource { get; set; }

[ObservableProperty]
Ressource? ressource;

并更改Ressource类中的代码:

[StringLength(50, ErrorMessage = "La description de la compétence ne doit pas dépasser 50 caractères.")]
public String? competence { get; set; }

[ObservableProperty]
[StringLength(50, ErrorMessage = "La description de la compétence ne doit pas dépasser 50 caractères.")]
String? competence;

在 xaml 中:

<Label Text="{Binding Ressource.Competence}"  LineBreakMode="WordWrap" Margin="0"/>
© www.soinside.com 2019 - 2024. All rights reserved.