【问题标题】:The data I enter into a TextBox is not being assigned to the value variable in a UWP app我输入到 TextBox 的数据未分配给 UWP 应用程序中的 value 变量
【发布时间】:2020-01-10 02:07:26
【问题描述】:

我正在使用模板 10 开发一个简单的 UWP 应用程序。我想将货币数据输入到文本框中。我的理解是我应该在 View-Model 中使用字符串变量。因此,目前我只是确保在运行应用程序时输入的数据确实有效。但事实并非如此。在运行或调试它时,如果我输入类似“10”(不带双引号)的内容,则分配的变量 value 是“0”。这对我来说没有意义。这是 XAML:

<TextBox
    x:Name="HourlyTextBox"
    Style="{StaticResource CommonTextboxStyle}"
    Text="{x:Bind ViewModel.Hourly, Mode=TwoWay}" />

这是来自 View-Model 的代码:

private string hourly;
public string Hourly
{
    get => hourly;
    set
    {
         _ = Set(ref hourly, value);
    }
}

这是代码隐藏代码:

using Windows.UI.Xaml.Controls;
using SalaryConv;

namespace SalaryConversion.Views
{
    public sealed partial class MainPage : Page
    {
        private SalaryUnitsEnum lastHadFocus;

        public MainPage()
        {
            InitializeComponent();
            NavigationCacheMode = 
Windows.UI.Xaml.Navigation.NavigationCacheMode.Enabled;
        }


        #region GettingFocus events

        private void HourlyTextBox_GettingFocus(Windows.UI.Xaml.UIElement sender, Windows.UI.Xaml.Input.GettingFocusEventArgs args)
        {
            if (lastHadFocus == SalaryUnitsEnum.Hourly)
            {
                return;
            }

            lastHadFocus = SalaryUnitsEnum.Hourly;

            ClearOtherMonetaryTextboxes(lastHadFocus);
        }

        private void WeeklyTextBox_GettingFocus(Windows.UI.Xaml.UIElement sender, Windows.UI.Xaml.Input.GettingFocusEventArgs args)
        {
            if (lastHadFocus == SalaryUnitsEnum.Weekly)
            {
                return;
            }

            lastHadFocus = SalaryUnitsEnum.Weekly;

            ClearOtherMonetaryTextboxes(lastHadFocus);
        }

        private void BiWeeklyTextBox_GettingFocus(Windows.UI.Xaml.UIElement sender, Windows.UI.Xaml.Input.GettingFocusEventArgs args)
        {
            if (lastHadFocus == SalaryUnitsEnum.BiWeekly)
            {
                return;
            }

            lastHadFocus = SalaryUnitsEnum.BiWeekly;

            ClearOtherMonetaryTextboxes(lastHadFocus);
        }

        private void SemiMonthlyTextBox_GettingFocus(Windows.UI.Xaml.UIElement sender, Windows.UI.Xaml.Input.GettingFocusEventArgs args)
        {
            if (lastHadFocus == SalaryUnitsEnum.SemiMonthly)
            {
                return;
            }

            lastHadFocus = SalaryUnitsEnum.SemiMonthly;

            ClearOtherMonetaryTextboxes(lastHadFocus);
        }

        private void MonthlyTextBox_GettingFocus(Windows.UI.Xaml.UIElement sender, Windows.UI.Xaml.Input.GettingFocusEventArgs args)
        {
            if (lastHadFocus == SalaryUnitsEnum.Monthly)
            {
                return;
            }

            lastHadFocus = SalaryUnitsEnum.Monthly;

            ClearOtherMonetaryTextboxes(lastHadFocus);
        }

        private void AnnuallyTextBox_GettingFocus(Windows.UI.Xaml.UIElement sender, Windows.UI.Xaml.Input.GettingFocusEventArgs args)
        {
            if (lastHadFocus == SalaryUnitsEnum.Annually)
            {
                return;
            }

            lastHadFocus = SalaryUnitsEnum.Annually;

            ClearOtherMonetaryTextboxes(lastHadFocus);
        }

        #endregion

        #region ClearOtherMonetaryTextboxes helper method

        private void ClearOtherMonetaryTextboxes(SalaryUnitsEnum lastHadFocus)
        {
            if (lastHadFocus != SalaryUnitsEnum.Hourly)
            {
                HourlyTextBox.Text = "0";
            }

            if (lastHadFocus != SalaryUnitsEnum.Weekly)
            {
                WeeklyTextBox.Text = "0";
            }

            if (lastHadFocus != SalaryUnitsEnum.BiWeekly)
            {
                BiWeeklyTextBox.Text = "0";
            }

            if (lastHadFocus != SalaryUnitsEnum.SemiMonthly)
            {
                SemiMonthlyTextBox.Text = "0";
            }

            if (lastHadFocus != SalaryUnitsEnum.Monthly)
            {
                MonthlyTextBox.Text = "0";
            }

            if (lastHadFocus != SalaryUnitsEnum.Annually)
            {
                AnnuallyTextBox.Text = "0";
            }
        }

        #endregion
    }
}

【问题讨论】:

  • 您好,您能提供有关_ = Set() 的详细信息吗?如果你不使用 ref,正常的hourly = value; 就可以了。
  • 对不起,理查德,我之前没有看到这个。在这种情况下,我在创建项目时使用了模板 10。 Set() 函数来自模板 10。
  • 对不起,我也使用了模板 10,但无法重现问题,它的值是正确的。你能给出一个完整的重复步骤或最少的可运行代码吗?
  • 嗨,Richard,我假设您的意思是来自 XAML。这是来自页面 XAML 的更大的 sn-p:
  • 对不起,我没有说清楚。我需要你的代码隐藏代码,你可以修改你的问题描述。这包括创建ViewModel 的过程,这对解决问题有很大帮助。

标签: c# uwp template10


【解决方案1】:

感谢 Richard Zhang 关于查看我的代码隐藏的建议,我在那里发现我之前编写了一些代码来处理屏幕上的控件。正是这段代码将值重置为 0(间接)。我前段时间写过那段代码,所以我把它全忘了。

谢谢你,Richard,提出这个建议。它帮助我了解了我所做的事情,并且在查看之后我能够轻松地解决它。

【讨论】:

    猜你喜欢
    • 2019-01-27
    • 2019-04-24
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 2017-01-15
    相关资源
    最近更新 更多