2012-10-04 81 views
1

在我的WPF應用程序(.Net 4.5)中,我想向UI提供有關驗證結果的擴展視覺反饋。數據層的驗證引擎通過INotifyDataErrorInfo接口返回警告和錯誤。

根據錯誤類型和錯誤消息列表,我有以下XAML顯示紅色或橙色邊框。這裏errorToColor是值轉換器的資源鍵,如果Validation.Errors集合中存在至少一個錯誤,並且只有警告存在橙色刷,則返回紅色刷。在Validation.Errors綁定中使用轉換器

 <TextBox Name="MappingName" Text="{Binding Path=Mapping.Name, NotifyOnValidationError=True}" > 
      <Validation.ErrorTemplate> 
       <ControlTemplate> 
        <DockPanel> 
         <Border BorderBrush="{Binding Converter={StaticResource errorsToColor}}" BorderThickness="1"> 
          <AdornedElementPlaceholder /> 
         </Border> 
         <ListView DisplayMemberPath="ErrorContent" ItemsSource="{Binding}" /> 
        </DockPanel> 
       </ControlTemplate> 
      </Validation.ErrorTemplate> 
     </TextBox> 

現在讓我們來看看當我在TextBox中鍵入一些「無效」文本時會發生什麼。

  • 鍵入'Text1'並更改焦點。
    調試器進入轉換器,兩個驗證器導致ListView中的兩個項目(1個錯誤和1個警告)和一個紅色邊框。 [確定]
  • 鍵入'文本'來糾正錯誤,改變焦點。
    價值轉換器甚至沒有被擊中!當然,同樣的紅色邊框。但是ListView已經改變並且只顯示一個警告。

有人可以解釋發生了什麼嗎?爲什麼ListView收到收集更改通知和邊界不是?這是因爲ListViewItemsControlValidation.Errors是否包含在CollectionView

+0

它可能與http://stackoverflow.com/questions/2816163/when-will-the-valueconverters-convert-method-be-called-in-wpf 添加新項目Validation.Errors引發CollectionChanged事件而PropertyChanged觸發值轉換器 – yuvin

回答

1

對於那些有興趣的人。 errorsToColor轉換器未被觸發,因爲當添加或刪除錯誤時,Validation.Errors集合沒有引發事件(需要觸發器綁定轉換器)PropertyChanged事件。

爲了提高PropertyChanged事件,我們需要綁定到在添加每個錯誤時更改的屬性,例如Count。我仍然需要轉換器中的Errors集合,所以我在這裏使用了多重綁定。

  <Border BorderThickness="1"> 
       <Border.BorderBrush> 
        <MultiBinding Converter="{StaticResource errorsToColor}"> 
         <Binding Path="." /> 
         <Binding Path=".Count" /> 
        </MultiBinding> 
       </Border.BorderBrush> 
       <AdornedElementPlaceholder Name="adornedElement" /> 
      </Border> 

現在errorsToColor轉換器(這是現在實現IMultiValueConverter)被執行每次添加/移除新的錯誤的時間。