在XAML中绑定到List中的一个项,但该项由同一ViewModel上的另一个属性获取

fcg9iug3  于 2023-08-01  发布在  其他
关注(0)|答案(1)|浏览(113)

我有这个问题与绑定,我不知道我做错了什么。我有一个包含索引属性的ViewModel,在同一个ViewModel中,还有另一个ViewModel的List<>。在我的XAML中,我试图从列表中由索引值指示的一个ViewModel中获取属性,但是除了使用文字数字之外,我在XAML中尝试的所有方法都不起作用。它确实在codebeath上进行了绑定,但它只更新了一次,再也没有更新过,而且它使用的是默认模式。
ViewModel通过UDP不断地(在某些情况下每隔1/60秒)单向传输。

CarDataViewModel.cs

public partial class CarDataViewModel : ObservableObject
{
    [ObservableProperty]
    private uint _currentLapTimeInMS;
    
    ...
}

字符串

MainViewModel.cs

public partial class MainViewModel : ObservableObject
{
    [ObservableProperty]
    private byte _playerIndex;

    [ObservableProperty]
    private List<CarDataViewModel> _carDataViewModels;

    public MainViewModel()
    {
        CarDataViewModels = new();
        for (int i = 0; i < 22; i++)
        {
            CarDataViewModel carDataViewModel = new();
            CarDataViewModels.Add(carDataViewModel);
        }
    }
}

MauiProgram.cs

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
                        .UseMauiCommunityToolkit()
                        .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });

                builder.Services.AddSingleton<MainViewModel>();
                return builder.Build();
    }
}

AppShell.xaml.cs

public partial class AppShell : Shell
{
    public AppShell()
    {
        InitializeComponent();

        BindingContext = ServiceHelper.GetService<MainViewModel>();
        ...
    }

    ...
}


当我直接使用显式列表索引访问时,它可以工作…

...

<!-- This updates fine -->
<Label Text={Binding CarDataViewModels[0].CurrentLapTimeInMS} />

...


...但是这个数组会根据运行的汽车数量而增长,所以UDP流也为我提供了我应该保持和关注的数组索引,我也将其作为MainViewModel中的属性。

ldfqzlk8

ldfqzlk81#

您需要创建另一个属性

[ObservableProperty]
private CarDataViewModel _selectedCarData;

字符串
然后在每次更新_playerIndex时更新它

SelectedCarData = CarDataViewModels[PlayerIndex];

相关问题