【发布时间】: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