2010-10-19 91 views
4

我沒有得到任何綁定錯誤,這段代碼在另一個地方工作。我還沒有發現我現在所做的與現在的代碼不同,它不是那麼多的代碼。WPF錯誤模板沒有顯示

UserControl.Resource:

<Style TargetType="TextBox"> 
    <Setter Property="BorderBrush" Value="DarkBlue"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Margin" Value="0,1,0,1"/> 
    <Setter Property="Validation.ErrorTemplate"> 
    <Setter.Value> 
     <ControlTemplate> 
     <StackPanel Orientation="Horizontal"> 
      <AdornedElementPlaceholder/> 
      <Grid Margin="2,0,0,0"> 
      <Ellipse Width="20" Height="20" Fill="Red"/> 
      <TextBlock Foreground="White" Text="X" FontWeight="Bold" 
         HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Grid> 
     </StackPanel> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
        Path=(Validation.Errors)[0].ErrorContent}"/> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

下面XAML中太:

<TextBlock Height="23" HorizontalAlignment="Left" Margin="22,90,0,0" 
      Text="Keywords" VerticalAlignment="Top"/> 
<TextBox Height="23" HorizontalAlignment="Left" Margin="22,108,0,0" 
     VerticalAlignment="Top" Width="244"> 
    <Binding Path="Tags" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
    <Binding.ValidationRules> 
     <DataErrorValidationRule ValidatesOnTargetUpdated="False"/> 
    </Binding.ValidationRules> 
    </Binding> 
</TextBox> 

的按鈕,在視圖模型我時保存的Model.Tags屬性爲長10個字符輸入時,纔會激活來自用戶。當我輸入10,11,然後返回8個字符時,按鈕激活/禁用工作正常。所有的財產變化都被解僱了。

型號

namespace TBM.Model 
{ 
    public class Document : EntityBase , IDataErrorInfo 
    { 
     public int Id { get; set; } 
     public string DocumentName { get; set; } 
     public string Tags { get; set; } 
     public byte[] DocumentData { get; set; } 
     public int PeriodId { get; set; } 

     string IDataErrorInfo.Error { get { return null; } } 

     string IDataErrorInfo.this[string propertyName] 
     { 
      get { return this.GetValidationError(propertyName); } 
     } 

     public bool IsValid 
     { 
      get 
      { 
       foreach (string property in ValidatedProperties) 
        if (GetValidationError(property) != null) 
         return false; 

       return true; 
      } 
     } 

     static readonly string[] ValidatedProperties = { "Tags", }; 

     private string GetValidationError(string propertyName) 
     { 
      if (Array.IndexOf(ValidatedProperties, propertyName) < 0) 
       return null; 

      string error = null; 

      switch (propertyName) 
      {    
       case "Tags": error = this.IsTagsEmpty(Tags); break; 

       default: 
        Debug.Fail("Unexpected property being validated on Document: " + propertyName); 
        break; 
      } 
      return error; 
     } 

     private string IsTagsEmpty(string value) 
     { 
      if (value != null && value.Trim().Length >= 10) 
       return null; 
      else 
       return "The keywords must have at least 10 chars!";    
     } 
    } 
} 

視圖模型

public RelayCommand SaveDocumentCommand 
{ 
    get { return _saveDocumentCommand ?? (_saveDocumentCommand = 
     new RelayCommand(() => SaveDocument(),() => CanSaveDocument())); } 
    } 

    private bool CanSaveDocument() 
    { 
     return _document.IsValid; 
    } 
//... 

什麼不起作用與紅色橢圓ErrorTemplate沒有顯示呢?

更新:下面的代碼恰好在TEST項目中起作用。但在我的生產性項目中,它找不到資源?爲什麼這個?

<TextBlock Height="23" HorizontalAlignment="Left" Margin="22,89,0,0" 
      Text="Keywords" VerticalAlignment="Top"/> 
    <TextBox Style="{StaticResource bla}" Height="23" HorizontalAlignment="Left" 
      Margin="22,109,0,0" VerticalAlignment="Top" Width="244"> 
    <Binding Path="Tags" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"> 
     <Binding.ValidationRules> 
     <DataErrorValidationRule ValidatesOnTargetUpdated="False" 
           ValidationStep="UpdatedValue"/> 
     </Binding.ValidationRules> 
    </Binding> 
    </TextBox> 

<UserControl.Resources> 
    <Style x:Name="bla" TargetType="TextBox"> 
    <Setter Property="BorderBrush" Value="DarkBlue"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="Margin" Value="0,1,0,1"/> 
    <Setter Property="Validation.ErrorTemplate"> 
     <Setter.Value> 
     <ControlTemplate> 
      <StackPanel Orientation="Horizontal">       
      <AdornedElementPlaceholder/> 
      <Grid Margin="2,0,0,0"> 
       <Ellipse Width="20" Height="20" Fill="Red"/> 
       <TextBlock Foreground="White" Text="X" FontWeight="Bold" 
         HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Grid> 
      </StackPanel> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="Validation.HasError" Value="True"> 
     <Setter Property="ToolTip" 
       Value="{Binding RelativeSource={RelativeSource Self}, 
        Path=(Validation.Errors)[0].ErrorContent}"/> 
     </Trigger> 
    </Style.Triggers> 
    </Style> 
</UserControl.Resources> 

回答

0

我也有過類似的問題這一點,竟然沒有成爲模板,但驗證沒有返回我的預期。

+0

驗證總是返回我期望的值。因此該按鈕被啓用/禁用。 – Elisabeth 2010-10-26 07:26:03

+0

我把你的代碼放到一個用戶控件中,並且IsEnabled屬性綁定到IsValid,並且它一切都很完美。您是否嘗試過在用戶界面上運行snoop,以確保您沒有與橢圓重疊的東西。有沒有其他的TextBox風格過度?嘗試將代碼從您的項目中取出並存入測試應用程序,並確保它在那裏工作。 – benPearce 2010-10-26 22:21:32

+0

是的,我仍然想測試它在一個額外的項目中孤立。儘管我仍然在左側留出了大約30像素的空間,但不可見......該死的也許是保證金...稍後再檢查一下。 Ooooh snoop不喜歡它並不像預期的那樣工作...... Afair沒有其他文本框隱式樣式或顯式樣式。我讓你知道laters ... – Elisabeth 2010-10-27 10:49:34

0

ViewModel必須實現IDataErrorInfo,而不是Model。 ViewModel作爲DataContext綁定到視圖,而不是Model,因此在ViewModel中實現接口並綁定到XAML中的相應屬性。

+3

這是有爭議的...... Josh Smith mvvm文章將驗證放在模型中,當您通過服務導出模型時,更希望將模型和驗證放在一起是首選,但在我的情況下,是的,我會改變這種情況。雖然我必須說你的解決方案與我的問題無關;-)你應該對此發表評論。 – Elisabeth 2010-10-29 15:04:45

11

我有類似的問題。打好幾個小時才能意識到adorner層出現問題。

我所做的就是把我的控制放在裏面。就是這樣。出於某種原因,這個裝飾圖層有時會消失。 TabControl肯定是這樣的(但在我的情況下,這是其他原因)。

因此,它應該是這樣的

<AdornerDecorator> 
    <Grid> 
    <TextBox .../> 
    </Grid> 
</AdornerDecorator> 

希望這有助於!

+2

這正是我所需要的。我遇到了在選項卡控件中的選項卡之間來回切換時顯示錯誤模板的問題。一旦我添加了AdornerDecorator,每當我切換到選項卡時,它都會一直顯示。謝謝! – Geo242 2014-03-25 19:41:25

+0

謝謝,那也是我的問題。這個答案提供了一些更多的見解[鏈接] http://stackoverflow.com/a/2597006/1477247 – Daniel 2014-08-01 18:30:13

+0

謝謝 - 我的問題是主題的變化 - 因爲我的錯誤模板根本不顯示,當我切換嵌入式用戶控件在窗口內。在嵌入式用戶控件的頂層添加'AdornerDecorator'修復了它。 – Wolfshead 2016-06-23 16:53:59