2011-09-13 140 views
2

我想在所有條件都爲真時將控件的「可見性」屬性設置爲指定值。如下例所示:手動評估條件

<TextBlock Text="TEST"> 
     <e:Interaction.Behaviors> 
      <bhv:VisibilityBehaviour VisibilityIfTrue="Visible" VisibilityIfFalse="Collapsed"> 
       <Condition Binding="{Binding BOOL1}" Value="true"/> 
       <Condition Binding="{Binding BOOL2}" Value="true"/> 
       <Condition Binding="{Binding BOOL3}" Value="true"/> 
      </bhv:VisibilityBehaviour> 
     </e:Interaction.Behaviors> 
    </TextBlock> 

如何手動評估這些條件?我知道如何獲得價值,但如果價值變化我沒有通知。

我知道我可以使用反射來獲取綁定目標的值。然後我可以比較這兩個值的條件。

通過屬性[ContentProperty(「Conditions」)],將VisibilityBehavior標籤之間的條件添加到列表中。

VisibilityBehavior.cs

[ContentProperty("Conditions")] 
public class VisibilityBehaviour : Behavior<FrameworkElement> 
{ 
    public static readonly DependencyProperty VisibilityProperty; 
    public Visibility Visibility 
    { 
     get { return (Visibility)GetValue(VisibilityProperty); } 
     set { SetValue(VisibilityProperty, value); } 
    } 

    public Visibility VisibilityIfTrue { get; set; } 
    public Visibility VisibilityIfFalse { get; set; } 
    public List<Condition> Conditions { get; set; } 

    static VisibilityBehaviour() 
    { 
     VisibilityProperty = DependencyProperty.Register("Visibility", typeof(Visibility), typeof(VisibilityBehaviour), new UIPropertyMetadata(Visibility.Visible)); 
    } 
    public VisibilityBehaviour() 
    { 
     Conditions = new List<Condition>(); 
    } 

    protected override void OnAttached() 
    { 
     base.OnAttached(); 

     FrameworkElement obj = AssociatedObject as FrameworkElement; 
     if (obj == null) 
      return; 
    } 

    protected override void OnDetaching() 
    { 
     base.OnDetaching(); 

     FrameworkElement obj = AssociatedObject as FrameworkElement; 
     if (obj == null) 
      return; 
    } 
} 

如何才能得到通知,如果有約束力的改變,一個示例的值: BOOL1是假的,然後更改爲true。

UPDATE:現在使用轉換器

MultiValueConverter,如果所有的布爾值將是真實的,那麼它返回Visibility.Visible,否則.Collapsed

如果條件綁定價值變動
<MultiBinding Converter="{StaticResource VisibilityConverter}" ConverterParameter="true"> 
    <Binding Path="BOOL1"/> 
    <Binding Path="BOOL2"/> 
    <Binding Path="BOOL3"/> 
</MultiBinding> 

ValueConverter,在這裏它不是notifiying ,但在這裏,我可以添加整個條件

<Binding Converter="{StaticResource VisibilityConverter}"> 
    <Binding.ConverterParameter> 
     <ConditionCollection > 
      <Condition Binding="{Binding BOOL1}" Value="true"/> 
      <Condition Binding="{Binding BOOL2}" Value="true"/> 
      <Condition Binding="{Binding BOOL3}" Value="true"/> 
     </ConditionCollection> 
    </Binding.ConverterParameter> 
</Binding> 

我需要這兩個轉換器,因爲

之間的混合
  • 我想在XAML中添加條件(如在ValueConverter)
  • 它需要更新,如果一個綁定的變化

任何想法的值?

+0

你想要做的就是定義在運行時這種行爲是什麼? – Seffix

回答

0

希望我正確理解你的問題:

可以一起使用IMultiValueConverter與MultiBinding到您的控制屬性綁定到一個以上的車型的性能,以及內部轉換器評估結果。

查看一個示例。

+0

多數民衆贊成在另一種方式來做到這一點,你怎麼看待使用IValueConverter並將conditionCollection中的條件傳遞給帶有參數的轉換器?當我使用IMultiValueConverter時,我必須寫入Binding標籤,並在這些Binding標籤中寫入Condition。 – kusi581

+0

盡我所知,當任何其他幾個值發生變化時,您需要更新Control的單個值。你也可以有一個Aggergate屬性,它實際上與Control屬性相關聯。在那個屬性中,你實際上評估了幾個條件。順便說一下,如果有任何屬性發生變化,您需要通知您。 – Tigran

0

您不會收到通知,因爲綁定對象不會更改。然而,綁定Source和Target Properties的值會做,所以你可能需要擴展你的Condition類(如果它自己的話)在綁定的TargetUpdated或SourceUpdate事件上註冊並進一步傳播該事件。

http://msdn.microsoft.com/de-de/library/system.windows.data.binding.aspx

對事件也讀了,因爲有需要確保(設置的綁定一些布爾變量)對於被觸發事件的特定條件。

希望有所幫助。另外,正如另一張海報已經提到的,你可能可以用MultiBindings來解決你的問題,放棄你的基於行爲的概念。

0

您在WPF使用樣式觸發器與MultiDataTrigger。
http://msdn.microsoft.com/en-us/library/system.windows.multidatatrigger.aspx

<Style TargetType="TextBlock"> 
    <Setter Property="Visibility" Value="Collapsed" /> 
    <Style.Triggers> 
    <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
     <Condition Binding="{Binding Binding1}" Value="Condition1" /> 
     <Condition Binding="{Binding Binding2}" Value="Condition2" /> 
     </MultiDataTrigger.Conditions> 
     <Setter Property="Visibility" Value="Visible" /> 
    </MultiDataTrigger> 
    </Style.Triggers> 
</Style>