在 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);
        }
    }
}

我发布了这段代码,以便任何有需要的人都能得到帮助(尤其是滑块和条目组合)

祝你有美好的一天!