簡體   English   中英

在WPF中的UserControl中的控件上顯示驗證錯誤模板

[英]Show Validation Error Template on Controls within a UserControl in WPF

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

我有一個UserControl包含兩個標簽,兩個TextBox和一個CheckBox。 其中一個TextBoxes表示實體的名稱,它綁定到ViewModel公開的Model屬性的Name屬性,該屬性是我的Window的DataContext。 Model類實現了IDataErrorInfo接口,我通過單元測試確認,當Name為空時,通過屬性索引器實現返回錯誤。 我已經綁定了支持UserControl中的Name TextBox的Dependency Property,當遇到驗證錯誤時,WPF錯誤模板在整個UserControl周圍放置一個紅色邊框,而不僅僅是Name TextBox。

綁定到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解決這個問題? 我忽略了一些明顯的東西嗎

如果綁定到UserControl使用ValidatesOnDataErrors=True將使用ErrorTemplate for UserControl 但是您可以使用Validation.ErrorTemplate附加屬性刪除紅色邊框。

如果您通過為后備DependencyProperties實現IDataErrorInfo來驗證其綁定,則UserControl所有控件將僅顯示紅色邊框。

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>

加成

如果要區分錯誤,可以獲取DependencyProperty的BindingExpression並檢查HasError屬性

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM