2011-07-19 43 views
3

我想驗證樹狀圖內的項目。主要思想是用戶從樹中選擇一個對象並加載其可編輯的細節。這一切都工作正常,因爲我有INotifyPropertyChanged迷上了,但...我的模型有驗證邏輯掛鉤(IDataErrorInfo),我也想在樹視圖中顯示它(突出顯示有驗證錯誤的項目)。treeview項目驗證

我已經嘗試了一些東西,但我無法弄清楚在哪裏把驗證放在綁定中,以使它像我想要的那樣工作。

我的驗證控件模板:

<ControlTemplate x:Key="validationTemplate"> 
      <StackPanel Orientation="Horizontal"> 
       <AdornedElementPlaceholder x:Name="MyAdorner" /> 
       <Image 
              MaxHeight="{Binding ElementName=MyAdorner, Path=ActualHeight}" 
              MaxWidth="20" 
              Source="{Binding Source={StaticResource ValidationIcon}, Converter={StaticResource UriConverter}}" 
              Margin="1" RenderOptions.BitmapScalingMode="HighQuality" 
              VerticalAlignment="Center" HorizontalAlignment="Center" /> 
      </StackPanel> 
     </ControlTemplate> 

樹視圖:

<TreeView ItemsSource="{Binding Path=ProductCategories}" 
       Name="treeView" SelectedItemChanged="treeView_SelectedItemChanged">   
       <TreeView.ItemTemplate> 
        <HierarchicalDataTemplate DataType="{x:Type data:ProductCategory}" 
             ItemsSource="{Binding Path=ProductCategories}"> 
         <StackPanel Orientation="Horizontal"> 
          <StackPanel.Style> 
           <Style TargetType="StackPanel"> 
            <Style.Triggers> 
             <Trigger Property="Validation.HasError" Value="True"> 
              <Setter Property="ToolTip" 
                Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/> 
              <Setter Property="Validation.ErrorTemplate" 
                Value="{StaticResource validationTemplate}" /> 
             </Trigger> 
            </Style.Triggers> 
           </Style> 
          </StackPanel.Style> 
          <StackPanel.BindingGroup> 
           <BindingGroup /> 
          </StackPanel.BindingGroup> 
          <StackPanel.ToolTip> 
           <TextBlock Margin="2" Text="{Binding Path=Description}" /> 
          </StackPanel.ToolTip> 
          <TextBlock Text="{Binding Path=Name}" FontSize="10" FontWeight="Medium" /> 
          <TextBlock Text="{Binding Path=ProductCount, StringFormat=' ({0})'}" /> 
         </StackPanel> 
        </HierarchicalDataTemplate> 
       </TreeView.ItemTemplate> 
      </TreeView> 

基本上我試圖把一個小圖標旁邊的項目在樹視圖如果底層模型驗證錯誤。

我試着玩BindingGroup但這是一個新的話題,所以我不知道如果這是甚至要走的路。

任何想法?

回答

1

首先,你需要幾個屬性的數據類像下面這樣:

public ObservableCollection<string> Errors 
{ 
    get 
    { 
     ObservableCollection<string> errors = new ObservableCollection<string>(); 
     errors.AddUniqueIfNotEmpty(this["PropertyToValidate1"]); 
     errors.AddUniqueIfNotEmpty(this["PropertyToValidate2"]); 
     ... 
     errors.AddUniqueIfNotEmpty(this["PropertyToValidateN"]); 
     return errors; 
    } 
} 

這第一個調用索引添加IDataErrorInfo,並增加了所有驗證錯誤到集合,如果他們不已經在那裏。 AddUniqueIfNotEmpty方法是一種擴展方法,它可以「做它在錫上說的話」。我相信你可以自己管理這部分。關於這個集合的好處是你可以綁定到它並且看到每個驗證錯誤的集合,而不是像在簡單的IDataErrorInfo實現中一樣。

public bool HasError 
{ 
    get { return Errors != null && Errors.Count > 0; } 
} 

第二屬性簡單地返回一個bool即表示是否存在該數據對象或不所有驗證錯誤。

然後,您可以簡單地綁定到您的TemplateStyle中的此屬性。如果相關數據對象有任何驗證錯誤,則此示例將更改Border的顏色。

<Style x:Key="ValidationBorderStyle" TargetType="{x:Type Border}"> 
    <Setter Property="Border.BorderBrush" Value="Black" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding HasError, FallbackValue=False}" Value="True"> 
      <Setter Property="Border.BorderBrush" Value="Red" /> 
     </DataTrigger> 
    </Style.Triggers> 
</Style>