如何使用 PopAsync 传递数据?
How to pass data using PopAsync?
我遇到以下情况:
我有一个应用程序,我想在其中使用一个特殊页面为其创建笔记。我有带有 ObservableCollection NoteItems 的 VM,其中包含所有注释。当我想创建一个新笔记时,我向这个 ObservableCollection 添加一个新笔记并使用 BindingContext
传递这个新笔记
var editingPage = new EditingPage();
editingPage.BindingContext = NoteItems[NoteItems.Count - 1].Text;
Application.Current.MainPage.Navigation.PushAsync(editingPage);
在编辑页面我有一个输入字段
<Entry
x:Name="EdtingPageEntryField"
Text="{Binding Text}"
Placeholder="Enter a note"
/>
,也就是用一个NoteItem的Text参数绑定他的文本。
问题是,如果我更改输入字段中的文本,它不会自动应用于 NoteItem 的文本参数。这就是为什么我想在关闭此 EditingPage(返回 MainPage)时传递此文本的原因。所以问题是,如何将此 Text 参数传递给位于 VM 中的 NoteItems ObservableCollection 中的 NoteItem 元素。
更新。位于NoteItems中的NoteItem的值不变
UPD2。 NoteItem 的值我错了,它已经被改变了,但是新的值没有显示在 MainPage 上,所以我使用了 INotifyPropertyChanged,但是没有起作用。
这是备注项class
public class NoteItem
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string text;
public string Text
{
get { return text; }
set
{
if(text != value)
{
text = value;
NotifyPropertyChanged();
}
}
}
和MainPage.xaml:
<ContentPage.BindingContext>
<local:NoteItemViewModel/>
</ContentPage.BindingContext>
<FlexLayout>
<ListView ItemsSource="{Binding NoteItems}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Text}"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</FlexLayout>
'''
为了动态更新 UI,您的模型必须实现 INotifyPropertyChanged
public class NoteItem : INotifyPropertyChanged
{
...
}
简单地添加一个 PropertyChanged
方法与实现 INotifyPropertyChanged
不同。您必须将接口添加到 class 定义中,以便绑定机制知道您的 class 已经实现了它
我遇到以下情况: 我有一个应用程序,我想在其中使用一个特殊页面为其创建笔记。我有带有 ObservableCollection NoteItems 的 VM,其中包含所有注释。当我想创建一个新笔记时,我向这个 ObservableCollection 添加一个新笔记并使用 BindingContext
传递这个新笔记 var editingPage = new EditingPage();
editingPage.BindingContext = NoteItems[NoteItems.Count - 1].Text;
Application.Current.MainPage.Navigation.PushAsync(editingPage);
在编辑页面我有一个输入字段
<Entry
x:Name="EdtingPageEntryField"
Text="{Binding Text}"
Placeholder="Enter a note"
/>
,也就是用一个NoteItem的Text参数绑定他的文本。 问题是,如果我更改输入字段中的文本,它不会自动应用于 NoteItem 的文本参数。这就是为什么我想在关闭此 EditingPage(返回 MainPage)时传递此文本的原因。所以问题是,如何将此 Text 参数传递给位于 VM 中的 NoteItems ObservableCollection 中的 NoteItem 元素。
更新。位于NoteItems中的NoteItem的值不变
UPD2。 NoteItem 的值我错了,它已经被改变了,但是新的值没有显示在 MainPage 上,所以我使用了 INotifyPropertyChanged,但是没有起作用。
这是备注项class
public class NoteItem
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
private string text;
public string Text
{
get { return text; }
set
{
if(text != value)
{
text = value;
NotifyPropertyChanged();
}
}
}
和MainPage.xaml:
<ContentPage.BindingContext>
<local:NoteItemViewModel/>
</ContentPage.BindingContext>
<FlexLayout>
<ListView ItemsSource="{Binding NoteItems}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label Text="{Binding Text}"/>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</FlexLayout>
'''
为了动态更新 UI,您的模型必须实现 INotifyPropertyChanged
public class NoteItem : INotifyPropertyChanged
{
...
}
简单地添加一个 PropertyChanged
方法与实现 INotifyPropertyChanged
不同。您必须将接口添加到 class 定义中,以便绑定机制知道您的 class 已经实现了它