如何解决我的 .Net MAUI 页面中的这个奇怪错误?

How do i solve this strange error in my .Net MAUI page?

提问人:Livio 提问时间:3/3/2023 更新时间:3/5/2023 访问量:304

问:

尝试学习 MAUI,我准备了一个隐藏标签的页面。在特定事件中,标签变得可见。一切都很好,但是当我将此标签放在“CollectionView”中时,试图将她与数据库中的值绑定,标签变为“当前上下文中不存在”,错误如下图所示。我犯的错误在哪里?谢谢!Error

带有 CollectionView 的 XAML 页面如下所示:XAML Pag

毛 伊 岛

评论

0赞 Jason 3/3/2023
请不要将代码或错误作为图像发布!
0赞 Jason 3/3/2023
这个问题已经讨论过很多次了。不能按名称引用模板中的项。需要使用数据绑定来控制 VM 中的模板化 UI 元素
0赞 Livio 3/4/2023
@Jason : 对不起。你能把关于这个问题的讨论之一联系起来吗?谢谢!
0赞 Jason 3/4/2023
google.com/......

答:

0赞 Jessie Zhang -MSFT 3/5/2023 #1

是的,您不能通过 引用模板中的项目。正如 Jason 所说,您可以使用数据绑定来控制 ViewModel 中的模板化 UI 元素。x:Name

根据您的代码,我创建了一个演示并实现了此功能。

您可以参考以下代码:

1.尝试将新属性添加到您的项目模型中,并将其绑定到您的标签。并且您还需要为您的 Item 实现接口,如果您更改 item 属性的值,UI 将自动刷新。IsVisibleMatrINotifyPropertyChangedIsVisible

public class Item: INotifyPropertyChanged 
{
    public int Id { get; set; }    

    public int  Value { get; set; }

    public string Matricola { get; set; }

     // add property IsVisible
    private bool _isVisible;
    public bool IsVisible
    {
        set { SetProperty(ref _isVisible, value); }
        get { return _isVisible; }
    }

    bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
    {
        if (Object.Equals(storage, value))
            return false;
        storage = value;
        OnPropertyChanged(propertyName);
        return true;
    }
    protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

2.创建视图模型 (TestViewModel.cs)

public class TestViewModel:BaseViewModel 
{
    //add other code in this ViewModel

    public ObservableCollection<Item> Items { get; private set; }

    public TestViewModel() {

        Items = new ObservableCollection<Item>();   

        Items.Add(new Item { Id = 01, Value = 10, Matricola = "test1"});
        Items.Add(new Item { Id = 02, Value = 13, Matricola = "test2" });
        Items.Add(new Item { Id = 03, Value = 16, Matricola = "test3" });

    }

3.使用示例:

TestPage.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"
             x:Class="MauiContentViewApp.TestPage"
             xmlns:MauiContentViewApp="clr-namespace:MauiContentViewApp;assembly=MauiContentViewApp"
             Title="TestPage">
    <VerticalStackLayout>
        <CollectionView ItemsSource="{Binding Items}">
            <CollectionView.ItemTemplate>
                <DataTemplate>
                    <Grid Padding="10">
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="*" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>

                        <Entry Grid.Column="0" 
                               BackgroundColor="Yellow"
                               Text="{Binding Value}" 
                               
                               Completed="Entry_Completed"  
                               VerticalOptions="Center" 
                               FontAttributes="Bold" />
                        <Label Grid.Row="1"
                               Grid.Column="1" 
                               Text="{Binding Matricola}"
                               
                               IsVisible="{Binding IsVisible}"
                               FontAttributes="Italic" 
                               VerticalOptions="Center" />
                    </Grid>
                </DataTemplate>
            </CollectionView.ItemTemplate>
        </CollectionView>
    </VerticalStackLayout>
</ContentPage>

TestPage.xaml.cs

public partial class TestPage : ContentPage 
{
      public TestPage()
      {
            InitializeComponent();

            BindingContext = new TestViewModel();
      }

    private void Entry_Completed(object sender, EventArgs e)
    {// here we can get the edited object and change the value of property `IsVisible` of this item ,then the `IsVisible` of `Matri` Label will be updated.
            Item item = (Item)((Entry)sender).BindingContext;

            if (item!=null && !item.IsVisible) {
            item.IsVisible= true;
        }
    }
}

评论

0赞 Livio 3/5/2023
张,非常感谢你的回答!!我从中学到了很多东西!!!
0赞 Jessie Zhang -MSFT 3/6/2023
我很高兴能帮助你。有好的一天。:)