在下面的代码中我绑定记录形成一个viewmodel,它正在使用一个observablecollection,我也提高了inotifypropertychange,现在我有一个按钮设置,它使用navigation.pushasync方法转到一个新页面,在那里即时更新数据库记录,我在这个新页面中创建了一个列表视图,并使用此处显示的相同绑定来绑定记录,每当我添加它更新的内容时,但是如果我按下后退按钮并返回到此EntryTabPage,则绑定不会更新,如果我完全关闭应用程序并重新启动它,它只会更新,显示数据。
我希望更新listview不确定如何操作,我尝试使用onappearing并在Listviewname.itemssource = Records中输入;但这显示错误"这在当前上下文中不存在"任何正确方向的帮助都将受到赞赏。
注意:绑定在其他地方有效,但在选项卡页面中除外。 这是Hierarchy TabbedPage-> ContentPage-> StackLayout-> ListView(在此列表视图中,绑定不会更新。
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Bunk_Master.EntryPageTab1"
Title="Default">
<StackLayout x:Name="stacklayout">
<ListView ItemsSource="{Binding Records}"
x:Name="classListView">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding}">
</TextCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
<Button Text="new"
x:Name="addclassbutton">
</Button>
</StackLayout>
namespace Bunk_Master
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class EntryPageTab1 : ContentPage
{
public EntryPageTab1()
{
InitializeComponent();
BindingContext = new ClassViewModel();
addclassbutton.Clicked += async (object sender, EventArgs e) =>
{
await this.Navigation.PushAsync(new AddClass());
};
}
protected override void OnAppearing()
{
base.OnAppearing();
}
}
}
这是ViewModel
namespace Bunk_Master
{
public class ClassViewModel : BaseViewModel
{
readonly Database db;
public string classname { get; set; }
// public int absentnos { get; set; }
// public int presentnos { get; set; }
public ICommand AddCommand { get; set; }
public ICommand DeleteCommand { get; set; }
public ObservableCollection<string> Records { get; set; }
public ClassViewModel()
{
AddCommand = new Command(Add);
DeleteCommand = new Command(Delete);
db = new Database("classdb");
db.CreateTable<ClassModel>();
Records = new ObservableCollection<string>();
ShowAllRecords();
}
void Add()
{
var record = new ClassModel
{
classname = classname,
//absentnum = absentnos,
//presentnum = presentnos
};
db.SaveItem(record);
Records.Add(record.ToString());
RaisePropertyChanged(nameof(Records));
ClearForm();
}
private void Delete(object obj)
{
throw new NotImplementedException();
}
void ClearForm()
{
classname = string.Empty;
RaisePropertyChanged(nameof(classname));
}
void ShowAllRecords()
{
Records.Clear();
var classdb = db.GetItems<ClassModel>();
foreach (var classmodel in classdb)
{
Records.Add(classmodel.ToString());
}
}
}
}
这是我实现Inotifypropertychange
的地方namespace Bunk_Master
{
public class BaseViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged([CallerMemberName] string propertyName = "")
{
var handler = PropertyChanged;
if (handler == null) return;
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
答案 0 :(得分:0)
如果有人碰巧发现一个类在一个类中工作而在另一个类中没有,并且你的代码是完美的,那只是因为必须使用你实例化的类而不是实例化一个新类。
只需添加此行即可修复我的代码
public static Workingclass classInstance = new Workingclass;
然后我使用classIncstance而不是在其他类中创建新实例,并且数据正在正确更新。
注意:我想删除这篇文章,但互联网上有很多其他类似的帖子,没有人解决这个简单的问题,也许有人会觉得它很有用。
答案 1 :(得分:0)
在ClassViewModel中更改,然后尝试。
namespace Bunk_Master
{
public class ClassViewModel : BaseViewModel
{
readonly Database db;
public string classname { get; set; }
// public int absentnos { get; set; }
// public int presentnos { get; set; }
public ICommand AddCommand { get; set; }
public ICommand DeleteCommand { get; set; }
public ObservableCollection<string> _records;
public ObservableCollection<string> Records
{
get { return _records; }
set
{
_records = value;
RaisePropertyChanged();
}
}
public ClassViewModel()
{
AddCommand = new Command(Add);
DeleteCommand = new Command(Delete);
db = new Database("classdb");
db.CreateTable<ClassModel>();
_records = new ObservableCollection<string>();
ShowAllRecords();
}
void Add()
{
var record = new ClassModel
{
classname = classname,
//absentnum = absentnos,
//presentnum = presentnos
};
db.SaveItem(record);
_records.Add(record.classname.ToString());
ClearForm();
}
private void Delete(object obj)
{
throw new NotImplementedException();
}
void ClearForm()
{
classname = string.Empty;
}
void ShowAllRecords()
{
_records.Clear();
var classdb = db.GetItems<ClassModel>();
foreach (var classmodel in classdb)
{
_records.Add(classmodel.ToString());
}
}
}
}
答案 2 :(得分:0)
您可能需要使用 this.DataContext = this;
才能使其工作。在我的情况下,如果我在分配 ItemsSource 之前打印 MessageBox.Show(),它只会显示列表。我通过添加上面的行来修复它。
希望能帮到你!