2010-11-26 107 views
0

我正在使用JulMar Mvvm-Helpers來幫助實現我的MVVM,從而開發新的C#4.0/Prism 4應用程序。我的驗證邏輯有問題。在過去,我一直在成功使用Prism 2.2 /企業庫驗證塊。但對於這個項目,我正在嘗試一些新的東西。使用MVVM-Helpers驗證屬性的WPF MVVM驗證問題

我的XAML代碼如下。

<UserControl x:Class="DoSomeThing.Views.DoSomeThingView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:Converters="clr-namespace:JulMar.Windows.Converters;assembly=JulMar.Wpf.Helpers" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" > 
<UserControl.Resources> 
    <Converters:ValidationErrorConverter x:Key="errorConverter"/> 
    <Style TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
      <Trigger Property="Validation.HasError" Value="true"> 
       <Setter Property="ToolTip" 
        Value="{Binding RelativeSource={RelativeSource Self}, 
        Path=(Validation.Errors), Converter={StaticResource errorConverter}}"/> 
       <Setter Property="Background" Value="Red" /> 
       <Setter Property="Foreground" Value="White" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</UserControl.Resources> 
<Grid Name="EditGrid" Margin="3"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="10" /> 
     <ColumnDefinition Width="100" /> 
     <ColumnDefinition Width="*" /> 
    </Grid.ColumnDefinitions> 

    <Label Grid.Column="1" Grid.Row="0" Content="Name" Height="21" VerticalAlignment="Top" /> 
    <Label Grid.Column="1" Grid.Row="1" Content="Address" /> 
    <Label Grid.Column="1" Grid.Row="2" Content="Zip" /> 
    <Label Grid.Column="1" Grid.Row="3" Content="Number Of Doors" /> 
    <Label Grid.Column="1" Grid.Row="4" Content="Double Number" /> 


    <TextBox Grid.Column="2" Grid.Row="0" Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" 
      HorizontalAlignment="Left" VerticalAlignment="Top" Width="200" /> 
    <TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Path=Address, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" 
      HorizontalAlignment="Left" VerticalAlignment="Top" Width="200"/> 
    <TextBox Grid.Column="2" Grid.Row="2" Text="{Binding Path=Zip, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" HorizontalAlignment="Left" 
      VerticalAlignment="Top" Width="200"/> 
    <TextBox Grid.Column="2" Grid.Row="3" Text="{Binding Path=NumberOfDoors, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" 
      HorizontalAlignment="Left" Height="21" Width="200"/> 
    <TextBox Grid.Column="2" Grid.Row="4" Text="{Binding Path=DoubleNumber, Mode=TwoWay, 
     UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, 
     ValidatesOnExceptions=True}" 
      HorizontalAlignment="Left" VerticalAlignment="Top" Width="200"/> 
    <Button Content="Save" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="4" Height="23" 
      HorizontalAlignment="Left" Margin="26,41,0,0" Name="button1" VerticalAlignment="Top" 
      Width="75" Command="{Binding SaveCommand}"/> 
</Grid> 

到視圖綁定到視圖模型的代碼是

  IRegion region = this._regionManager.Regions["MainRegion"]; 
     var v = new DoSomeThingView(); 
     var model = new SampleDataModel 
      { 
       Name = "hello", 
       NumberOfDoors = 5, 
       Zip = "12345", 
       DoubleNumber = 321.12, 
       Address = "no where's ville" 
      }; 

     var vm = new SampleDataViewModel { DataModel = model }; 

     v.EditGrid.DataContext = vm; 
     region.Add(v); 

所有編輯邏輯的工作方式上做視圖模型驗證屬性。我的問題是使用bool CanSaveCommand(object param)函數來防止存在任何驗證錯誤時保存。

我不明白如何檢測出現任何驗證錯誤。建議?

回答

0

爲了解決我的問題,我最終明確調用了viewmodel驗證例程並檢查結果。

我的視圖模型繼承自ValidatingViewModel基類。這允許訪問靜態ValidationManager類如下 -

private bool CanSaveExecute(object param) 
{ 
    string v = ValidationManager.Validate(null, this); 
    bool b = v.Length == 0; 
    return b; 
} 

隨着第一個參數爲null,它測試在具有驗證屬性的視圖模型的所有屬性。然後,如果返回的錯誤消息字符串的長度> 0,則可以檢測到存在驗證錯誤。