【问题标题】:Integer type property not changing when value is changed in UWP app with Template 10 validation使用模板 10 验证在 UWP 应用程序中更改值时整数类型属性未更改
【发布时间】:2018-05-30 21:05:46
【问题描述】:

感谢您的光临。

我正在尝试在 UWP 应用程序中使用模板 10 验证来验证绑定到整数类型属性的文本框,但是当数据是字符时,set 访问器不会触发,只有当它是整数时才会触发。当我使用字符串类型属性时,一切正常。我正在使用 MVVM 灯。

这是我的模型:

public class User : ValidatableModelBase
{
    public User()
    {
    }

    public string FirstName
    {
        get
        {
            return Read<string>();
        }
        set
        {
            Write(value);
        }
    }
    public string LastName
    {
        get
        {
            return Read<string>();
        }
        set
        {
            Write(value);
        }
    }

    public int ID
    {
        get
        {
            return Read<int>();
        }
        set
        {
            Write(value);
        }
    }



    public override string ToString() => $"{FirstName} {LastName}";
}

这是我的类,它返回一些示例数据并指定验证逻辑:

public static class UserService
{
    public static User GetUser()
    {
        var user = new User
        {
            Validator = i =>
            {
                var u = i as User;
                if (string.IsNullOrEmpty(u.FirstName))
                {
                    u.Properties[nameof(u.FirstName)].Errors.Add("First name is required");
                }
                if (string.IsNullOrEmpty(u.LastName))
                {
                    u.Properties[nameof(u.LastName)].Errors.Add("Last name is required");
                }
                int x;
                if (!int.TryParse(u.ID.ToString(), out x))
                {
                    u.Properties[nameof(u.ID)].Errors.Add("Integers only allowed");
                }

            }
        };

        return user;
    }
}

这是我的 ViewModel:

public class BlankViewModel : ViewModelBase
{
    public RelayCommand ValidateCommand { get; private set; }
    public BlankViewModel()
    {
             ValidateCommand = new RelayCommand(ValidateCommandAction);
    }

    private void ValidateCommandAction()
    {
        //Do something
    }

    private async Task<User> GetUser()
    {
        return await Task.Run(() => UserService.GetUser()).ConfigureAwait(false);
    }

    User _selected;
    public Models.User Selected
    {
        get
        {
            _selected = GetUser().Result;
            return _selected;
        }
        set
        {
            try
            {
                Set(ref _selected, value);
            }
            catch (Exception)
            {


            }

        }
    }

}

这里是视图:

<Grid 
        Grid.Row="1" 
        Background="{ThemeResource SystemControlPageBackgroundChromeLowBrush}">
        <!--The SystemControlPageBackgroundChromeLowBrush background represents where you should place your content. 
            Place your content here.-->
        <StackPanel DataContext="{Binding Selected}">
            <validate:ControlWrapper PropertyName="FirstName">
                <TextBox Text="{Binding FirstName, Mode=TwoWay}" Header="First Name"/>
            </validate:ControlWrapper>
            <validate:ControlWrapper PropertyName="LastName">
                <TextBox Text="{Binding LastName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="Last Name"/>
            </validate:ControlWrapper>
            <validate:ControlWrapper PropertyName="ID">
                <TextBox Text="{Binding ID,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Header="ID"/>
            </validate:ControlWrapper>
            <Button Content="Validate" IsEnabled="{Binding IsValid}"/>
        </StackPanel>
    </Grid>

firstname 和 lastname 属性一切正常,但 ID 属性验证逻辑和 set 访问器在属性设置为字符时不会触发,只有当它是整数时才会触发,即使它是双精度数时也不会触发。

非常感谢您的帮助。提前非常感谢。

【问题讨论】:

    标签: c# xaml uwp mvvm-light template10


    【解决方案1】:

    应该是Template10.Validation中的ValidatableModelBase类的问题。

    作为Introducing Template10 Validation

    如果您有反馈或要报告的错误,请在此处提交:https://github.com/Windows-XAML/Template10/issues

    您可以在上面的链接中报告此问题。

    目前,您可以将您的 int ID 属性更改为 string 类型,然后将您的 GetUser 静态方法更改为以下代码,它可以很好地满足您的要求.

    public static User GetUser()
    {
        var user = new User
        {
            Validator = i =>
            {
                var u = i as User;
                if (string.IsNullOrEmpty(u.FirstName))
                {
                    u.Properties[nameof(u.FirstName)].Errors.Add("First name is required");
                }
                if (string.IsNullOrEmpty(u.LastName))
                {
                    u.Properties[nameof(u.LastName)].Errors.Add("Last name is required");
                }
                if (string.IsNullOrEmpty(u.ID))
                {
                    u.Properties[nameof(u.ID)].Errors.Add("Integers is required");
                }
                else
                {
                    int x;
                    bool success = int.TryParse(u.ID.ToString(), out x);
                    if (!success)
                    {
                        u.Properties[nameof(u.ID)].Errors.Add("Integers only allowed");
                    }
                }
            }
        };
        return user;
    }
    

    【讨论】:

    • 感谢您的回复!不幸的是,我无法更改属性的数据类型,因为它会破坏我正在处理的应用程序。这只是我为这个问题制作的一个样本。我很感激你的回复。我通过创建一个环绕问题整数属性的字符串属性解决了这个问题,它工作正常。
    • @VivekVerma 好的,用字符串属性包装 int 属性也是一个更好的解决方案。我只能看到这个样本并为样本提供解决方案。我也很高兴听到您的解决方案。您可以将您的解决方案分享给以后访问此线程的其他方便的人。
    猜你喜欢
    • 2021-10-18
    • 2015-09-27
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多