提问人:Livio 提问时间:3/3/2023 更新时间:3/5/2023 访问量:304
如何解决我的 .Net MAUI 页面中的这个奇怪错误?
How do i solve this strange error in my .Net MAUI page?
问:
尝试学习 MAUI,我准备了一个隐藏标签的页面。在特定事件中,标签变得可见。一切都很好,但是当我将此标签放在“CollectionView”中时,试图将她与数据库中的值绑定,标签变为“当前上下文中不存在”,错误如下图所示。我犯的错误在哪里?谢谢!
答:
0赞
Jessie Zhang -MSFT
3/5/2023
#1
是的,您不能通过 引用模板中的项目。正如 Jason 所说,您可以使用数据绑定来控制 ViewModel 中的模板化 UI 元素。x:Name
根据您的代码,我创建了一个演示并实现了此功能。
您可以参考以下代码:
1.尝试将新属性添加到您的项目模型中,并将其绑定到您的标签。并且您还需要为您的 Item 实现接口,如果您更改 item 属性的值,UI 将自动刷新。IsVisible
Matr
INotifyPropertyChanged
IsVisible
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
我很高兴能帮助你。有好的一天。:)
下一个:多列组合框 vb.net
评论