После завершения настройки MVVM Light в приложении Universal App для Windows у меня есть следующая структура, и мне интересно, что является самым чистым способом проверки в 2017 году с использованием UWP и mvvmlight для уведомлять пользователей об ошибках и, возможно, сбросить значение текстового поля, когда это необходимо. Единственный трюк в том, что текстовое поле является частью UserControl (для ясности очищено ненужный код xaml), поскольку он будет использоваться несколько раз. Также я добавил DataAnnotations и ValidationResult для демонстрации и не предполагал, что это лучший способ сделать это, или что он работает каким-либо образом до сих пор.Проверка с использованием MVVM Light в универсальном приложении Windows
код работает отлично, насколько обязательными и добавление и удаление значений
ViewModel
using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Views; using System; using System.ComponentModel.DataAnnotations; public class ValidationTestViewModel : ViewModelBase { private int _age; [Required(ErrorMessage = "Age is required")] [Range(1, 100, ErrorMessage = "Age should be between 1 to 100")] [CustomValidation(typeof(int), "ValidateAge")] public int Age { get { return _age; } set { if ((value > 1) && (value =< 100)) _age= value; } } public static ValidationResult ValidateAge(object value, ValidationContext validationContext) { return null; } }
Посмотреть
<Page x:Class="ValidationTest.Views.ValidationTestPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ValidationTest.Views" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" DataContext="{Binding ValidationTestPageInstance, Source={StaticResource Locator}}" xmlns:views="using:ValidationTest.Views"> <views:NumberEdit TextInControl="{Binding Age, Mode=TwoWay}" /> </Page>
UserControl
<UserControl x:Class="ValidationTest.Views.Number" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:ValidationTest.Views" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" x:Name="userControl1"> <Grid> <TextBox x:Name="content" Text="{Binding TextInControl, ElementName=userControl1, Mode=TwoWay}"></TextBox> </Grid> </UserControl>
UserControl Код За:
public partial class NumberEdit : UserControl { public string TextInControl { get { return (string)GetValue(TextInControlProperty); } set { SetValue(TextInControlProperty, value); } } public static readonly DependencyProperty TextInControlProperty = DependencyProperty.Register("TextInControl", typeof(string), typeof(NumberEdit), new PropertyMetadata(null)); }
Есть ли какие-либо изменения должны быть сделаны в XAML? Кроме того, ссылка PropertyChangedCallback не работает – usefulBee
просто fyi, обе ссылки работают на меня –
@usefulBee Вы должны иметь возможность добавлять DataContext на страницу или элемент управления, также я обновил код в методе StringChanged. –