ViewModel 上的 QueryProperty 在 .NET MAUI 中分配给变量太晚了?

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

我正在从主页调用页面,并使用 QueryProperty 传递字符串。我想评估这个字符串并根据传递的字符串创建不同的对象列表,以便我可以为不同的事情重用同一页面。

问题是,当 EnterValueViewModel 运行并且我想检查传递的字符串时,该值仍然为 null。赋值后如何运行 if 语句?

[QueryProperty("TypeOfCaller", "TypeOfCaller")]


public partial class EnterValueViewModel : ObservableObject
{
    [ObservableProperty]
    string typeOfCaller;

    [ObservableProperty]
    ObservableCollection<string> listOfObjects;

    public EnterValueViewModel()
    {
        if (typeOfCaller == "PermitHolder")
        {
            listOfObjects = new ObservableCollection<string>(PermitHolderRepository.GetPermitHolders().Select(p => p.Name));
        }
        else if (typeOfCaller == "Company")
        {
            listOfObjects = new ObservableCollection<string>(CompanyRepository.GetCompanies().Select(p => p.Name));
        }
        else if (typeOfCaller == "Facility")
        {
            listOfObjects = new ObservableCollection<string>(FacilityRepository.GetFacilities().Select(p => p.Name));
        }
    }

我尝试将 if 语句放入方法中,但我不知道何时调用它。我需要一个在页面加载后但用户可以与其交互之前执行的事件。

c# xaml mvvm maui viewmodel
1个回答
0
投票

要在可观察属性更改时执行代码,请使用该属性的自动生成方法之一。

https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/generators/observableproperty

另外,如果每次都要重新创建 ObservableCollection,为什么还要使用它呢?只需创建一次集合并根据需要更新即可。

public partial class EnterValueViewModel : ObservableObject
{
    [ObservableProperty]
    string typeOfCaller;

    public ObservableCollection<string> ListOfObjects {get;} = new ObservableCollection<string>();

    partial void OnTypeOfCallerChanged(string newValue)
    {
        ListOfObjects.Clear();

        List<string> newObjects;

        if (newValue == "PermitHolder")
        {
            newObjects = PermitHolderRepository.GetPermitHolders().Select(p => p.Name)).ToList();
        }
        else if (newValue == "Company")
        {
            newObjects = CompanyRepository.GetCompanies().Select(p => p.Name)).ToList();
        }
        else if (newValue == "Facility")
        {
            newObjects = FacilityRepository.GetFacilities().Select(p => p.Name)).ToList();
        }
        else
        {
            return;
        } 

        foreach(string newObject in newObjects)
        {
            ListOfObjects.Add(newObject);
        } 
    } 
}
© www.soinside.com 2019 - 2024. All rights reserved.