Проверка списка MVVM - PullRequest
       6

Проверка списка MVVM

1 голос
/ 21 марта 2012

Я использую Caliburn.Micro для условного связывания содержимого моего списка из коллекции BindableCollection в моей ViewModel.

Я хочу выполнить валидацию, чтобы при отсутствии выбора и выходе пользователя из формы он получал красную красную линию вокруг списка с сообщением об ошибке, что ему нужно выбрать значение. Пока что Caliburn отлично работал для проверки текстового поля, но я не могу заставить его работать в списке!

Кстати, есть ли способ принудительно запустить полную проверку с ВМ? В настоящее время я просто выполняю ручную проверку, проверяя значения и меняя их так, чтобы запустить Валидатор, который немного задом наперед ..

Вот код для моего взгляда:

<UserControl x:Class="AddSessionDialogView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">

<toolkit:BusyIndicator IsBusy="{Binding IsBusy}" BusyContent="{Binding IsBusyStatusDisplay}">
    <Grid x:Name="LayoutRoot" Background="White">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="auto" />
            <RowDefinition Height="auto"/>
        </Grid.RowDefinitions>
        <Grid.Resources>
            <Style TargetType="TextBlock">
                <Setter Property="Margin" Value="5,9" />
            </Style>
            <Style TargetType="TextBox">
                <Setter Property="Margin" Value="5" />
            </Style>
        </Grid.Resources>
        <TextBlock Text="Session Name" />
        <TextBox x:Name="SessionName" Grid.Column="1"  />
        <TextBlock Text="Scenario" Grid.Row="1" />
        <ListBox x:Name="Scenarios" Grid.Row="1" Grid.Column="1" DisplayMemberPath="Name" Margin="5" />
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" VerticalAlignment="Bottom" Grid.Column="1" Grid.Row="3" Margin="5">
            <Button x:Name="Cancel" Height="28" Margin="5" Content="Cancel" Padding="0,2" Width="75" />
            <Button x:Name="OK" Height="28" Margin="5" Content="OK" Padding="0,2" Width="100" />
        </StackPanel>
    </Grid>
</toolkit:BusyIndicator>

Вот (соответствующий) код для моей модели представления:

    public BindableCollection<Scenario> Scenarios { get; set; }

    [Required(ErrorMessage = "You must select a scenario")]
    public Scenario SelectedScenario { get; set; }

    private string _sessionName;

    [Required(ErrorMessage="Session Name is invalid")]
    public string SessionName
    {
        get { return _sessionName; }
        set { _sessionName = value; NotifyOfPropertyChange(() => SessionName); }
    }

    public IEnumerable<IResult> OK()
    {
        if (SelectedScenario == null)
        {
            // This forces validation check, but doesnt show validation error on the view!
            SelectedScenario = new Scenario();
            SelectedScenario = null;
        }
        if (SessionName == null)
            SessionName = "";
        if (Validator.TryValidateObject(this, new ValidationContext(this), new List<ValidationResult>()))
        {
            IsBusy = true;
            IsBusyStatusDisplay = "Creating Session...";
            yield return new CreateSessionResult(SelectedScenario.Id, SessionName);
            IsBusy = false;
            yield return Close();
        }
    }
...