2011-09-05 38 views
5

我有控制這就是從文本框ValidationRules

public class MyTextBox : TextBox 

這有風格繼承

<Style TargetType="{x:Type Controls:MyTextBox}"> 

的二傳手之一是

<Setter Property="Template"> 

我希望能夠到將Binding.ValidationRules設置爲模板中的某些內容,從而影響此類textb的所有實例牛。 因此,我可以使文本框的時間,日期,數字,郵政編碼..或任何我想要的,

我不想每次創建文本框時都必須設置驗證規則。我只想說我想要一個NumericTextBox並讓它以模板中設置的任何方式進行驗證。

這可能嗎?

我到目前爲止所見到的是在控件的每個實例上設置的ValidationRules。

<TextBox x:Name="txtEMail" Template={StaticResource TextBoxErrorTemplate}> 
<TextBox.Text> 
    <Binding Path="EMail" UpdateSourceTrigger="PropertyChanged" > 
     <Binding.ValidationRules> 
      <local:RegexValidationRule Pattern="{StaticResource emailRegex}"/> 
     </Binding.ValidationRules> 
    </Binding> 
</TextBox.Text> 

(從http://www.wpftutorial.net/DataValidation.html

回答

1

我不確定有可能做到你想要的。你可以在屬性設置器中使用很多技巧來做到這一點(我不會依賴這個,因爲它會涉及修改綁定,它們根據定義是動態的),或者使用代碼隱藏/定製控件。

相反,我建議你將你的驗證推入你的ViewModel,可能與IDataErrorInfo。那裏有很多文章。這是第一個的人我用搜索找到剛纔的「MVVM驗證」之一:

MVVM - Validation

這樣做將允許您使用標準的面向對象的構圖手法,這樣你就可以avoid repeating yourself :)

+0

我想我會給這個方法一個去 –

4

如你所見,驗證規則與綁定一起設置。我遇到了同樣的問題,對我來說,工作的解決辦法是做這樣的事情:

public MyTextBox() 
    {    
     this.Loaded += new RoutedEventHandler(MyTextBox_Loaded); 
    } 

    void MyTextBox_Loaded(object sender, RoutedEventArgs e) 
    { 
     var binding = BindingOperations.GetBinding(this, TextBox.ValueProperty); 
     binding.ValidationRules.Add(new MyValidationRule()); 
    } 

這裏的問題是要確保我們添加驗證規則之前的綁定設置,因此,使用的加載,但我不確定這是否適用於所有情況。

+0

嗯。好的。那麼這怎麼符合mvvm。我們應該把這個綁定和驗證連接放在代碼後面嗎?在xaml上進行每個綁定並且按照我想象的方式忘記模板一樣簡單/難嗎? –

+0

這種方法是架構不可知的,並且將用於一般驗證,否則我不會看到創建從文本框繼承的新類的要點。在你的例子中,你需要檢查一個有效的電子郵件。如果您需要應用程序特定的數據驗證,則應始終使用IDataErrorInfo。 – Natxo

+0

是的,我認爲用usercontrols代碼後面的代碼是可以的。它是一個用戶控件,它執行特定的工作並確保其數據有效。 –

相關問題