2013-10-28 19 views
0

我在我的Project Sample中有一個名爲ContainsValidationRule的類。我在這個項目中有一個名爲MainWindowViewModel的viewModel。代碼看起來像這樣:傳遞一個viewmodel類名作爲參數來驗證從ValidationRule類繼承的類的方法

namespace Sample 
{ 
    using System.Globalization; 
    using System.Linq; 
    using System.Windows.Controls; 

    public class ContainsValidationRule : ValidationRule 
    { 
     public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
     { 
      var result = MainWindowViewModel.CurrentInstance.Items.Any(x => x.ToLower(cultureInfo).Contains((value as string).ToLower(cultureInfo))); 
      return new ValidationResult(result, "No Reason"); 
     } 
    } 
} 

它運作良好。但是,不要讓MainViewViewModel硬編碼,我想將它作爲參數傳遞給Validate Method。所以我也可以將這個類用於其他ViewModels。

如果有更好的解決方案,然後傳遞ViewModel名稱作爲參數,請描述。

+0

這篇文章(http://stackoverflow.com/questions/4345606/binding-datacontext-to-validationrule),可能會讓你感興趣。 – AirL

+2

ValidationRule確實是驗證事物的「舊」風格方式。你應該看看'INotifyDataErrorInfo' – Shoe

+1

我同意@Shoe,但我不得不承認......我無法弄清楚你在這裏驗證了什麼......你能否給我啓發? – Sheridan

回答

1

嗯,我必須說你的代碼有點令人困惑。通常你會使用這個值作爲你正在驗證的內容。

例如:

<TextBox.Text> 
<Binding Path="SomeProperty" UpdateSourceTrigger="PropertyChanged"> 
    <Binding.ValidationRules> 
     <validations:YourValidationName ValidatesOnTargetUpdated="True" /> 
    </Binding.ValidationRules> 
</Binding> 
</TextBox.Text> 

這將完成,就是當你更新你的文本框,它會驗證它,如果它是無效的,你會得到的紅色邊框(或任何風格,你設置)和錯誤。

有關另一方面,完全忽視了你的驗證,並且將使用硬編碼MainWindowViewModel.CurrentInstance.Items...,檢查的事情對象...

總之,object value是參數。

總之,我認爲你應該閱讀如何使用驗證,並修改你的邏輯和代碼。