2013-02-19 37 views
6

如何讓WPF錯誤模板出現在WPF中的UserControl中的控件上?在WPF中的UserControl中的控件上顯示驗證錯誤模板

我有含有兩個標籤,兩個文本框,和一個CheckBox一個用戶控件。其中一個TextBoxes表示實體的名稱,並且它綁定到名稱屬性,而不是由我的ViewModel公開的Model屬性(它是我的Window的DataContext)。 Model類實現了IDataErrorInfo接口,並且通過單元測試證實,當Name爲空時,通過屬性索引器實現返回錯誤。我綁定了支持我的UserControl中名稱文本框的依賴項屬性,當遇到驗證錯誤時,WPF錯誤模板在整個UserControl周圍放置一個紅色邊框,而不僅僅是名稱文本框。

到該用戶控件的名稱字段的結合如下。

<vc:MyUserControl ItemName="{Binding Model.Name, ValidatesOnDataErrors=True}" /> 

我的UserControl和後備DependencyProperty的簡化版本如下。

<UserControl> 
    <Grid> 
     <TextBox Text="{Binding ItemName}" /> 
    </Grid> 
</UserControl> 

public partial class MyUserControl: UserControl 
{ 
    public static readonly DependencyProperty ItemNameProperty = 
     DependencyProperty.Register(
      "ItemName", 
      typeof(string), 
      typeof(MyUserControl), 
      new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 
    ); 

    public string ItemName 
    { 
     get { return (string)GetValue(ItemNameProperty); } 
     set { SetValue(ItemNameProperty, value); } 
    } 
} 

我發現關於這個問題迄今已全部在問候的Silverlight或使用轉換器不顯示紅色邊框(其中沒有任何意義,我)的信息。這些信息都是在stackoverflow上找到的。

有人可以用WPF解決這個問題嗎?我忽略了一些明顯的東西?

+0

相關的問題[這裏](http://stackoverflow.com/q/7808986/620360)和[這裏](http://stackoverflow.com/q/1198342/620360) – LPL 2013-02-19 19:13:18

+0

謝謝,LPL。在我對這個問題的研究中,我看到了這兩個問題。在第二個鏈接上接受的答案是使用我在我的問題中引用的轉換器。這對我來說似乎很不對勁。第一個問題中接受的答案似乎也不適用於我。 – CoderDawson 2013-02-19 21:25:19

回答

9

對於UserControl,將使用ErrorTemplate如果與您的UserControl使用ValidatesOnDataErrors=True綁定。但是您可以使用Validation.ErrorTemplate Attached Property刪除紅色邊框。

內的所有控制你的UserControl將只顯示一個紅色邊框,如果你通過實施IDataErrorInfo爲後盾DependencyProperties過驗證其綁定。

public class MyUserControl : UserControl, IDataErrorInfo 
{ 
    public static readonly DependencyProperty ItemNameProperty = 
     DependencyProperty.Register(
      "ItemName", 
      typeof(string), 
      typeof(MyUserControl), 
      new FrameworkPropertyMetadata(string.Empty, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault) 
    ); 

    public string ItemName 
    { 
     get { return (string)GetValue(ItemNameProperty); } 
     set { SetValue(ItemNameProperty, value); } 
    } 

    public string Error 
    { 
     get { throw new NotImplementedException(); } 
    } 

    public string this[string columnName] 
    { 
     get 
     { 
     // use a specific validation or ask for UserControl Validation Error 
     return Validation.GetHasError(this) ? "UserControl has Error" : null; 
     } 
    } 
} 

這裏簡化XAML

<UserControl Validation.ErrorTemplate="{x:Null}"> 
    <Grid DataContext="{Binding RelativeSource={RelativeSource AncestorType=UserControl}}"> 
     <TextBox Text="{Binding ItemName, ValidatesOnDataErrors=True}" /> 
    </Grid> 
</UserControl> 

加成

如果你想的錯誤,你可以得到BindingExpression您的DependencyProperty,並檢查HasError Property區分。

BindingExpression be = BindingOperations.GetBindingExpression(this, ItemNameProperty); 
return be != null && be.HasError ? "ItemName has Error" : null; 
+0

再次感謝LPL。我最初嘗試了一個類似的更改,但我無法確定UserControl內部的哪個TextBoxes有錯誤,因爲在TextBox本身上調用Validation.GetHasError時總是返回false。無論如何,我的UserControl中有兩個文本框可以確定哪個盒子實際上有錯誤? – CoderDawson 2013-02-20 18:54:02

+0

不知道我以前做錯了什麼,但這似乎爲我工作。我仍然沒有看到如何區分獨特的TextBoxes上的錯誤,但在這一點上,我將只對其中的一個進行驗證。謝謝,LPL! – CoderDawson 2013-02-20 22:02:39

+1

我已經添加了一個建議來區分錯誤。 ;) – LPL 2013-02-20 23:27:59

相關問題