2011-01-31 101 views
4

在隱藏控件時,如何在WPF中隱藏驗證錯誤模板裝飾(默認爲紅色框)?當我隱藏我的控件時(爲了便於在視圖之間切換),錯誤裝飾物仍然存在。隱藏控件時隱藏驗證裝飾

更困難的是,我如何使用MVVM來做到這一點?

+0

對於切換視圖我使用的視圖模型的usercontrols的列表,並結合當前視圖內容控件的內容屬性。而且我還沒有發現爲單個模型切換不同視圖的明顯例子。 – vorrtex 2011-01-31 20:11:31

+0

@vorrtex,我只是將一大堆視圖綁定到單個視圖模型,並讓區域管理器將其整理出來。我的問題不是視圖 - 視圖模型綁定,而是切換UI的效果。當我讓我的控制不可見時,矩形框停留在周圍。 – Jordan 2011-01-31 21:41:29

回答

7

Validation.ErrorTemplate的默認ControlTemplate有一個AdornedElementPlaceholder,它反過來參考其AdornedElement。它看起來像這樣

<ControlTemplate> 
    <Border BorderBrush="Red" BorderThickness="1"> 
     <AdornedElementPlaceholder /> 
    </Border> 
</ControlTemplate> 

從這裏就可以在Border的可見性結合到AdornedElementPlaceholder.AdornedElement的知名度,鏈接自己的知名度。然後我們讓所有有這個問題的Control使用這個Validation.ErrorTemplate而不是默認的。這裏有一個例子

的XAML

<Window.Resources> 
    <ControlTemplate x:Key="ValidationErrorTamplate"> 
     <Border Visibility="{Binding ElementName=placeHolder, 
            Path=AdornedElement.Visibility}" 
       BorderBrush="Red" 
       BorderThickness="1"> 
      <AdornedElementPlaceholder x:Name="placeHolder"/> 
     </Border> 
    </ControlTemplate> 
</Window.Resources> 
<TextBox ... 
     Validation.ErrorTemplate="{StaticResource ValidationErrorTamplate}"> 

更新
要引用父UserControl你可以

1.對於你可以走了邏輯樹的特定控制使用綁定在Parent物業

:如果TextBox位於一個StackPanelUserControl我們可以Parent.Parent

引用它
<UserControl ...> 
    <StackPanel> 
     <TextBox ... 
       Validation.ErrorTemplate="{StaticResource ValidationErrorTamplate2}"> 

<ControlTemplate x:Key="ValidationErrorTamplate2"> 
    <Border Visibility="{Binding ElementName=placeHolder, 
           Path=AdornedElement.Parent.Parent.Visibility}" 
      BorderBrush="Red" 
      BorderThickness="1"> 
     <AdornedElementPlaceholder x:Name="placeHolder"/> 
    </Border> 
</ControlTemplate> 

2.對於一個更有活力的方法,您可以使用一個ResourceDictionary與隱藏文件代碼,你做使用Border的Loaded事件。在這裏面,你走了可視化樹尋父UserControl和使用,作爲源綁定

ValidationErrorTemplateDictionary.xaml

<ResourceDictionary x:Class="ValidationErrorVisibility.ValidationErrorTemplateDictionary" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <ControlTemplate x:Key="ValidationErrorTamplate3"> 
     <Border BorderBrush="Red" 
       BorderThickness="1" 
       Loaded="ValidationAdorner_Loaded"> 
      <AdornedElementPlaceholder/> 
     </Border> 
    </ControlTemplate> 
</ResourceDictionary> 

ValidationErrorTemplateDictionary.xaml.cs

public partial class ValidationErrorTemplateDictionary 
{ 
    private void ValidationAdorner_Loaded(object sender, RoutedEventArgs e) 
    { 
     Border adornedBorder = sender as Border; 
     Binding visibilityBinding = new Binding("Visibility"); 
     UIElement adornedElement = ((AdornedElementPlaceholder)adornedBorder.Child).AdornedElement; 
     UserControl parentUserControl = GetVisualParent<UserControl>(adornedElement); 
     visibilityBinding.Source = parentUserControl; 
     adornedBorder.SetBinding(Border.VisibilityProperty, visibilityBinding); 
    } 

    public static T GetVisualParent<T>(object childObject) where T : Visual 
    { 
     DependencyObject child = childObject as DependencyObject; 
     while ((child != null) && !(child is T)) 
     { 
      child = VisualTreeHelper.GetParent(child); 
     } 
     return child as T; 
    } 
} 

你的用戶控件

<UserControl ...> 
    <UserControl.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="ValidationErrorTemplateDictionary.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </UserControl.Resources> 
    <StackPanel> 
     <TextBox ... 
       Validation.ErrorTemplate="{StaticResource ValidationErrorTamplate3}"> 
0

我剛剛解決這個問題挺,可見性和透明度。

我通過創建I數據綁定ErrorTemplate可視性和不透明度爲繼承的附加屬性做到了。在父元素(淡入淡出/正在摺疊的實際元素)上,我只是簡單地將新附加屬性綁定到可見性和不透明度。

此方法使用WPF的邏輯樹和現有的屬性值繼承你的知名度控制母會是什麼模板來解決,而不代碼背後的問題,或特定的知識。

事後,我可以創建一個FrameWorkElement類型的附加屬性,然後我可以使用它來綁定父元素上的任何屬性。這種方法將涉及更少的綁定和更少的代碼,同時提供更多的靈活性。也許附加的屬性已經存在讓你做同樣的事情。

你可以在這裏閱讀所有關於附加屬性:http://msdn.microsoft.com/en-us/library/ms749011.aspx

或者,這是一個很好的堆棧: How exactly do Attached Properties work in WPF?