在 C# 中使用来自 slider/entry 的值
working with the value from slider/entry in c#
所以我目前正在编写一个 Xamarin.Forms 程序,该程序从用户输入中收集数据,但我不知道如何使用我的 Entry/Slider 组合 provides/how 中的数据提取它。
这是我链接到输入字段的滑块的样子:
<Entry
Text="{Binding Path=Value}"
FontSize="18"
x:Name="label"
BindingContext="{x:Reference Name=Slider}" />
<Slider
BindingContext="{Binding Score}"
x:Name="Slider"
Maximum="100"
VerticalOptions="CenterAndExpand" />
在 ViewModel 中,代码如下所示:
private int score;
public int Score
{
get => score;
set => SetProperty(ref score, value);
}
FinalScore = score
然后将其传递到(工作中的)sqlite 数据库。
我迫切需要帮助,因为我已经尝试解决这个问题 2-3 天了,但没有任何效果。在数据库中,FinalScore 始终为 0?!
In the DB the FinalScore is always 0?!
那是因为FinalScore
只得到了score
的初值。
然后,每次更新Score
,你不更新FinalScore
。
您可以参考以下代码:
private int score;
public int Score
{
get => score;
set {
SetProperty(ref score, value);
//update the valueof `FinalScore ` once updating `Score`
FinalScore = score;
}
}
注:
您还需要验证输入值以确保它可以转换为滑块可接受的值。
感谢您为我提供的帮助,但正如我在对@Jessie Zhang -MSFT 的评论中所述,问题出在绑定上,因为我使用 BindingContext
提取了我本应使用的滑块值Value="{Binding Score}"
.
我知道,我的问题问得不够好(不应该向数据库寻求帮助,因为我不需要任何帮助)你们无法帮助我。这是由于我缺乏 C# 和开发方面的经验。因此,我想感谢@Jessie Zhang 和@ToolmakerSteve 在断点等方面的帮助
这是我为每个反对类似问题的人准备的新的、有效的代码(我也切换到使用 string
而不是 int
,因为以后需要使用 output-number我把它作为 string
):
slider-entrybox-combination:
<Entry
Text="{Binding Path=Value}"
FontSize="18"
x:Name="label"
BindingContext="{x:Reference Name=Slider}"/>
<Slider
Value="{Binding Score}"
x:Name="Slider"
Maximum="100"
VerticalOptions="CenterAndExpand" />
视图模型:
private string score;
public string Score
{
get => score;
set => SetProperty(ref score, value);
}
(还有 ViewModel)数据库的 SaveFunction:
private async void OnSave()
{
DatabaseEntry newEntry = new DatabaseEntry()
{
FinalScore = Score
};
await App.Database.SaveDatabaseEntry(newEntry);
// This will pop the current page off the navigation stack
await Shell.Current.GoToAsync("..");
}
另一个用户 Entry-Class 对此感到好奇:
using System;
using SQLite;
namespace MyProject.Models
{
[Table("DatabaseEntry")]
public class DatabaseEntry : IComparable
{
[PrimaryKey, AutoIncrement, Column("ID")]
public int ID { get; set; }
[Column("FinalScore")]
public string FinalScore { get; set; }
public int CompareTo(object other)
{
var otherEntry = (DatabaseEntry)other;
if (otherEntry == null)
return 1;
if (ID == otherEntry.ID)
return 0;
return 1;
}
}
}
最终 SQLite-Database 本身:
using System.Collections.Generic;
using System.Threading.Tasks;
using SQLite;
using MyProject.Models;
namespace MyProject.Services
{
public class Database
{
readonly SQLiteAsyncConnection database;
public Database(string dbPath)
{
database = new SQLiteAsyncConnection(dbPath);
database.CreateTableAsync<DatabaseEntry>().Wait();
}
public Task<List<DatabaseEntry>> GetDatabaseEntries()
{
return database.Table<DatabaseEntry>().ToListAsync();
}
public Task<DatabaseEntry> GetDatanaseEntry(int id)
{
return database.Table<DatabaseEntry>().Where(i => i.ID == id).FirstOrDefaultAsync();
}
public Task<int> SaveDatabaseEntry(DatabaseEntry entry)
{
if (entry.ID != 0)
{
return database.UpdateAsync(entry);
}
else
{
return database.InsertAsync(entry);
}
}
public Task<int> DeleteDatabaseEntry(DatabaseEntry entry)
{
return database.DeleteAsync(entry);
}
}
}
我发布了这段代码,以便任何有需要的人都能得到帮助(尤其是滑块和条目组合)
祝你有美好的一天!
所以我目前正在编写一个 Xamarin.Forms 程序,该程序从用户输入中收集数据,但我不知道如何使用我的 Entry/Slider 组合 provides/how 中的数据提取它。
这是我链接到输入字段的滑块的样子:
<Entry
Text="{Binding Path=Value}"
FontSize="18"
x:Name="label"
BindingContext="{x:Reference Name=Slider}" />
<Slider
BindingContext="{Binding Score}"
x:Name="Slider"
Maximum="100"
VerticalOptions="CenterAndExpand" />
在 ViewModel 中,代码如下所示:
private int score;
public int Score
{
get => score;
set => SetProperty(ref score, value);
}
FinalScore = score
然后将其传递到(工作中的)sqlite 数据库。
我迫切需要帮助,因为我已经尝试解决这个问题 2-3 天了,但没有任何效果。在数据库中,FinalScore 始终为 0?!
In the DB the FinalScore is always 0?!
那是因为FinalScore
只得到了score
的初值。
然后,每次更新Score
,你不更新FinalScore
。
您可以参考以下代码:
private int score;
public int Score
{
get => score;
set {
SetProperty(ref score, value);
//update the valueof `FinalScore ` once updating `Score`
FinalScore = score;
}
}
注:
您还需要验证输入值以确保它可以转换为滑块可接受的值。
感谢您为我提供的帮助,但正如我在对@Jessie Zhang -MSFT 的评论中所述,问题出在绑定上,因为我使用 BindingContext
提取了我本应使用的滑块值Value="{Binding Score}"
.
我知道,我的问题问得不够好(不应该向数据库寻求帮助,因为我不需要任何帮助)你们无法帮助我。这是由于我缺乏 C# 和开发方面的经验。因此,我想感谢@Jessie Zhang 和@ToolmakerSteve 在断点等方面的帮助
这是我为每个反对类似问题的人准备的新的、有效的代码(我也切换到使用 string
而不是 int
,因为以后需要使用 output-number我把它作为 string
):
slider-entrybox-combination:
<Entry
Text="{Binding Path=Value}"
FontSize="18"
x:Name="label"
BindingContext="{x:Reference Name=Slider}"/>
<Slider
Value="{Binding Score}"
x:Name="Slider"
Maximum="100"
VerticalOptions="CenterAndExpand" />
视图模型:
private string score;
public string Score
{
get => score;
set => SetProperty(ref score, value);
}
(还有 ViewModel)数据库的 SaveFunction:
private async void OnSave()
{
DatabaseEntry newEntry = new DatabaseEntry()
{
FinalScore = Score
};
await App.Database.SaveDatabaseEntry(newEntry);
// This will pop the current page off the navigation stack
await Shell.Current.GoToAsync("..");
}
另一个用户 Entry-Class 对此感到好奇:
using System;
using SQLite;
namespace MyProject.Models
{
[Table("DatabaseEntry")]
public class DatabaseEntry : IComparable
{
[PrimaryKey, AutoIncrement, Column("ID")]
public int ID { get; set; }
[Column("FinalScore")]
public string FinalScore { get; set; }
public int CompareTo(object other)
{
var otherEntry = (DatabaseEntry)other;
if (otherEntry == null)
return 1;
if (ID == otherEntry.ID)
return 0;
return 1;
}
}
}
最终 SQLite-Database 本身:
using System.Collections.Generic;
using System.Threading.Tasks;
using SQLite;
using MyProject.Models;
namespace MyProject.Services
{
public class Database
{
readonly SQLiteAsyncConnection database;
public Database(string dbPath)
{
database = new SQLiteAsyncConnection(dbPath);
database.CreateTableAsync<DatabaseEntry>().Wait();
}
public Task<List<DatabaseEntry>> GetDatabaseEntries()
{
return database.Table<DatabaseEntry>().ToListAsync();
}
public Task<DatabaseEntry> GetDatanaseEntry(int id)
{
return database.Table<DatabaseEntry>().Where(i => i.ID == id).FirstOrDefaultAsync();
}
public Task<int> SaveDatabaseEntry(DatabaseEntry entry)
{
if (entry.ID != 0)
{
return database.UpdateAsync(entry);
}
else
{
return database.InsertAsync(entry);
}
}
public Task<int> DeleteDatabaseEntry(DatabaseEntry entry)
{
return database.DeleteAsync(entry);
}
}
}
我发布了这段代码,以便任何有需要的人都能得到帮助(尤其是滑块和条目组合)
祝你有美好的一天!