Xamarin 表单未实现绑定
Xamarin forms is not implementing Binding
我是 Xamarin 表单的新手,我正在尝试创建一个包含一些输入的简单应用程序并将它们保存在数据库中。但是绑定似乎不起作用,我不确定哪里出了问题。
这是模型:
using SQLite;
using System;
using System.Collections.Generic;
using System.Text;
namespace SiteVisits.Models
{
[Table("Well")]
public class Well
{
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string LatitudeCoordinates { get; set; }
public string LongitudeCoordinates { get; set; }
}
}
视图模型:
using MvvmHelpers;
using MvvmHelpers.Commands;
using SiteVisits.Data;
using SiteVisits.Models;
using SiteVisits.Services;
using SiteVisits.Views;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace SiteVisits.ViewModels
{
public class WellViewModel : BaseViewModel
{
public AsyncCommand SaveCommand { get; private set; }
public int ID { get; set; }
public WellViewModel()
{
Title = "Well Information";
SaveCommand = new AsyncCommand(Save);
var wellService = DependencyService.Get<IWellDataStore>();
}
string latitudeCoordinates, longitudeCoordinates;
public string LatitudeCoordinates
{
get => latitudeCoordinates;
set
{
latitudeCoordinates = value;
OnPropertyChanged("LatitudeCoordinates");
}
}
public string LongitudeCoordinates
{
get => longitudeCoordinates;
set
{
longitudeCoordinates = value;
OnPropertyChanged("LongitudeCoordinates");
}
}
private async Task Save()
{
if (string.IsNullOrWhiteSpace(latitudeCoordinates) ||
string.IsNullOrWhiteSpace(longitudeCoordinates))
{
return;
}
await WellDataStore.AddWell(latitudeCoordinates, longitudeCoordinates);
// This will pop the current page off the navigation stack
await Shell.Current.GoToAsync("..");
}
}
}
服务:
using SiteVisits.Models;
using SQLite;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Essentials;
namespace SiteVisits.Services
{
public class WellDataStore
{
static SQLiteAsyncConnection db;
static async Task Init()
{
if (db != null)
return;
// Get an absolute path to the database file
var databasePath = Path.Combine(FileSystem.AppDataDirectory, "MyData.db");
db = new SQLiteAsyncConnection(databasePath);
await db.CreateTableAsync<Well>();
}
public static async Task AddWell(string latitudeCoordinates, string longitudeCoordinates)
{
await Init();
var well = new Well()
{
LatitudeCoordinates = latitudeCoordinates,
LongitudeCoordinates = longitudeCoordinates
};
await db.InsertAsync(well);
}
public async Task<Well> GetWell(int id)
{
await Init();
var well = await db.Table<Well>()
.FirstOrDefaultAsync(c => c.ID == id);
return well;
}
}
}
接口:
using SiteVisits.Models;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace SiteVisits.Services
{
public interface IWellDataStore
{
Task AddWell(string latitudeCoordinates, string longitudeCoordinates);
Task<Well> GetWell(int id);
}
}
查看:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:viewModel="clr-namespace:SiteVisits.ViewModels" x:DataType="viewModel:WellViewModel"
x:Class="SiteVisits.Views.WellInfo">
<ContentPage.BindingContext>
<viewModel:WellViewModel />
</ContentPage.BindingContext>
<ContentPage.ToolbarItems>
<ToolbarItem Text="Save" Command="{Binding SaveCommand}"></ToolbarItem>
</ContentPage.ToolbarItems>
<AbsoluteLayout>
<StackLayout AbsoluteLayout.LayoutBounds = "0,0,1,1" AbsoluteLayout.LayoutFlags = "All">
<ScrollView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<StackLayout Spacing="20" Padding="15" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<Label Text="Latitude Coordinates:" />
<Entry BindingContext="{Binding LatitudeCoordinates}" x:Name="LatitudeCoordinates" FontSize="Medium"/>
<Label Text="Longitude Coordinates:" />
<Entry BindingContext="{Binding LongitudeCoordinates}" x:Name="LongitudeCoordinates" FontSize="Medium"/>
</StackLayout>
</ScrollView>
</StackLayout>
</AbsoluteLayout>
</ContentPage>
和xaml.cs:
using SiteVisits.Models;
using SiteVisits.Services;
using SiteVisits.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace SiteVisits.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class WellInfo : ContentPage
{
WellViewModel viewModel;
public WellInfo(WellViewModel viewModel)
{
InitializeComponent();
this.viewModel = viewModel;
BindingContext = this.viewModel;
}
public WellInfo()
{
InitializeComponent();
viewModel = new WellViewModel();
BindingContext = viewModel;
}
}
}
BaseViewModel 的类型为 INotifyPropertyChanged。当我在 Task Save() 的 ViewModel 中放置一个断点时,它显示 latitudeCoordinates 和 longitudeCoordinate null,即使我试图在其中放置值。
非常感谢任何帮助!
这是错误的
<Entry BindingContext="{Binding LatitudeCoordinates}" FontSize="Medium"/>
您需要绑定 Text
属性
<Entry Text="{Binding LatitudeCoordinates}" FontSize="Medium"/>
我是 Xamarin 表单的新手,我正在尝试创建一个包含一些输入的简单应用程序并将它们保存在数据库中。但是绑定似乎不起作用,我不确定哪里出了问题。
这是模型:
using SQLite;
using System;
using System.Collections.Generic;
using System.Text;
namespace SiteVisits.Models
{
[Table("Well")]
public class Well
{
[PrimaryKey, AutoIncrement]
public int ID { get; set; }
public string LatitudeCoordinates { get; set; }
public string LongitudeCoordinates { get; set; }
}
}
视图模型:
using MvvmHelpers;
using MvvmHelpers.Commands;
using SiteVisits.Data;
using SiteVisits.Models;
using SiteVisits.Services;
using SiteVisits.Views;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
namespace SiteVisits.ViewModels
{
public class WellViewModel : BaseViewModel
{
public AsyncCommand SaveCommand { get; private set; }
public int ID { get; set; }
public WellViewModel()
{
Title = "Well Information";
SaveCommand = new AsyncCommand(Save);
var wellService = DependencyService.Get<IWellDataStore>();
}
string latitudeCoordinates, longitudeCoordinates;
public string LatitudeCoordinates
{
get => latitudeCoordinates;
set
{
latitudeCoordinates = value;
OnPropertyChanged("LatitudeCoordinates");
}
}
public string LongitudeCoordinates
{
get => longitudeCoordinates;
set
{
longitudeCoordinates = value;
OnPropertyChanged("LongitudeCoordinates");
}
}
private async Task Save()
{
if (string.IsNullOrWhiteSpace(latitudeCoordinates) ||
string.IsNullOrWhiteSpace(longitudeCoordinates))
{
return;
}
await WellDataStore.AddWell(latitudeCoordinates, longitudeCoordinates);
// This will pop the current page off the navigation stack
await Shell.Current.GoToAsync("..");
}
}
}
服务:
using SiteVisits.Models;
using SQLite;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Essentials;
namespace SiteVisits.Services
{
public class WellDataStore
{
static SQLiteAsyncConnection db;
static async Task Init()
{
if (db != null)
return;
// Get an absolute path to the database file
var databasePath = Path.Combine(FileSystem.AppDataDirectory, "MyData.db");
db = new SQLiteAsyncConnection(databasePath);
await db.CreateTableAsync<Well>();
}
public static async Task AddWell(string latitudeCoordinates, string longitudeCoordinates)
{
await Init();
var well = new Well()
{
LatitudeCoordinates = latitudeCoordinates,
LongitudeCoordinates = longitudeCoordinates
};
await db.InsertAsync(well);
}
public async Task<Well> GetWell(int id)
{
await Init();
var well = await db.Table<Well>()
.FirstOrDefaultAsync(c => c.ID == id);
return well;
}
}
}
接口:
using SiteVisits.Models;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace SiteVisits.Services
{
public interface IWellDataStore
{
Task AddWell(string latitudeCoordinates, string longitudeCoordinates);
Task<Well> GetWell(int id);
}
}
查看:
<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:viewModel="clr-namespace:SiteVisits.ViewModels" x:DataType="viewModel:WellViewModel"
x:Class="SiteVisits.Views.WellInfo">
<ContentPage.BindingContext>
<viewModel:WellViewModel />
</ContentPage.BindingContext>
<ContentPage.ToolbarItems>
<ToolbarItem Text="Save" Command="{Binding SaveCommand}"></ToolbarItem>
</ContentPage.ToolbarItems>
<AbsoluteLayout>
<StackLayout AbsoluteLayout.LayoutBounds = "0,0,1,1" AbsoluteLayout.LayoutFlags = "All">
<ScrollView HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<StackLayout Spacing="20" Padding="15" HorizontalOptions="FillAndExpand" VerticalOptions="FillAndExpand">
<Label Text="Latitude Coordinates:" />
<Entry BindingContext="{Binding LatitudeCoordinates}" x:Name="LatitudeCoordinates" FontSize="Medium"/>
<Label Text="Longitude Coordinates:" />
<Entry BindingContext="{Binding LongitudeCoordinates}" x:Name="LongitudeCoordinates" FontSize="Medium"/>
</StackLayout>
</ScrollView>
</StackLayout>
</AbsoluteLayout>
</ContentPage>
和xaml.cs:
using SiteVisits.Models;
using SiteVisits.Services;
using SiteVisits.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
namespace SiteVisits.Views
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class WellInfo : ContentPage
{
WellViewModel viewModel;
public WellInfo(WellViewModel viewModel)
{
InitializeComponent();
this.viewModel = viewModel;
BindingContext = this.viewModel;
}
public WellInfo()
{
InitializeComponent();
viewModel = new WellViewModel();
BindingContext = viewModel;
}
}
}
BaseViewModel 的类型为 INotifyPropertyChanged。当我在 Task Save() 的 ViewModel 中放置一个断点时,它显示 latitudeCoordinates 和 longitudeCoordinate null,即使我试图在其中放置值。
非常感谢任何帮助!
这是错误的
<Entry BindingContext="{Binding LatitudeCoordinates}" FontSize="Medium"/>
您需要绑定 Text
属性
<Entry Text="{Binding LatitudeCoordinates}" FontSize="Medium"/>