2012-04-29 63 views
0

我有一個註冊表格,只有幾個字段。這是一個PRISM MVVM應用程序。如何讓View Model知道成功驗證的表格

領域之一的XAML看起來像這樣(RegisterView.xaml):

<TextBlock>Surname</TextBlock> 
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"  HorizontalAlignment="Left" Margin="0" Name="Surname" VerticalAlignment="Top" > 
    <TextBox.Text> 
     <Binding Path="Surname" UpdateSourceTrigger="LostFocus" > 
      <Binding.ValidationRules> 
       <val:Required /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

正如你可以從上面的代碼看,我用需要驗證字段類。 Function的Function Validate()必需然後返回ValidationResult對象。我還爲輸入的樣式定義了一些觸發器,因此我可以將驗證結果顯示給用戶。

我不知道什麼是如何檢測的視圖模型中的所有輸入驗證的狀態。在ViewModel中,我有SaveUserCanExecute函數,它應該在所有輸入的驗證狀態下啓用/禁用基本上的註冊表單提交按鈕。

那麼有什麼簡單的方法來實現這個目標?

我可以爲此做一些解決方法,但我認爲不是正確的方法。

現在,我做了一個視圖代碼Submit_Click功能上提交按鈕的Click事件被解僱。

在RegisterView.xaml

<Button Content="Register" HorizontalAlignment="Left" Margin="0" Name="Submit" VerticalAlignment="Top" Command="{x:Static inf:Commands.SaveUser}" Click="Submit_Click" /> 

我也是在代碼中創建新的公共布爾變量 「formIsValid」 的背後。按下提交按鈕後,我檢查是否所有輸入都沒有驗證錯誤(使用Validation.GetHasError(InputName)函數)。如果是這樣,我將formIsValid變量設置爲true,否則將其設置爲false。

在RegisterView.xaml.cs

private void Submit_Click(object sender, RoutedEventArgs e) 
{ 
    if (Validation.GetHasError(Firstname) == false && Validation.GetHasError(Surname) == false) 
    { 
     registerFormValid = true; 
    } 
    else 
    { 
     registerFormValid = false; 
    } 
} 

然後在視圖模型SaveUserCanExecute功能如下:

private bool SaveUserCanExecute(string parameter) 
{ 
    if (View.registerFormValid == true) 
    { 
     return true; 
    } 
    return false; 
} 

但正如我前面提到的,我覺得不it​​'s適當的方式,以及我正在尋找更清晰的方式。

回答

1

在您的ViewModel中實現了IDataErrorInfo,那麼您就擁有了虛擬機中需要的所有信息。你的XAML只需要ValidatesOnDataErrors =真

<TextBlock>Surname</TextBlock> 
<TextBox Validation.ErrorTemplate="{StaticResource validationTemplate}"  HorizontalAlignment="Left" Margin="0" Name="Surname" VerticalAlignment="Top" > 
     <TextBox.Text> 
      <Binding Path="Surname" UpdateSourceTrigger="LostFocus" ValidatesOnDataErrors="True"> 
      </Binding> 
     </TextBox.Text> 
</TextBox> 

編輯:檢查使用DelegeCommand,然後你的命令CanExecute可以簡單的檢查然後string.IsNullOrEmpty(this.Error)。

+0

好吧,聽起來不錯,但如何恰當地實現IDataErrorInfo來返回驗證結果?我查了很多IDataErrorInfo的例子,幾乎在他們把公共字符串這個[string propertyName] {驗證函數在這裏}一些驗證函數。但我不想這樣做,因爲我已經使用將驗證函數綁定到xaml元素,而且我不想再調用同一個函數兩次。謝謝。 – mantonn

+0

如果我調用MessageBox.Show(this.Error);在我的代碼中,那麼它什麼都不顯示,即使消息框沒有顯示。 – mantonn

+0

最後,我使用了IDataErrorInfo,謝謝 – mantonn

0

綁定的命令(ICommand的)到您的提交按鈕,並實施其CanExecute方法這個邏輯。這是一個經典的ICommand實現。

+0

這是我以一種不同的方式做的。我已經綁定了複合命令到我的提交按鈕(請參閱Command =「{x:Static inf:Commands.SaveUser}」)。問題是,它的CanExecute函數在ViewModel中,所以這就是爲什麼我需要獲得關於驗證所有輸入的信息。或者我沒有得到你的答案。不管怎麼說,還是要謝謝你。 – mantonn

+0

當您構建一個ICommand對象時,您同時執行了Execute和CanExecute。這是在viewmodel級別完成的,因此你可以傳入你現有的方法。當任何輸入元素焦點改變時,WPF將自動調用CanExecute。 – anivas