2012-09-06 66 views
9

我需要綁定一個TextBox滿足兩個標準:多個結合IsEnable

  • 的IsEnabled如果Text.Length> 0
  • 的IsEnabled如果user.IsEnabled

user.IsEnabled從拉一個數據源。我想知道是否有人有一個簡單的方法來做到這一點。

這裏是XAML:

<ContentControl IsEnabled="{Binding Path=Enabled, Source={StaticResource UserInfo}}"> 
    <TextBox DataContext="{DynamicResource UserInfo}" Text="{Binding FirstName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=Text, RelativeSource={RelativeSource Self}, Converter={StaticResource LengthToBool}}"/> 
</ContentControl> 
+0

你想如何結合這兩個屬性?如果兩者都是對的,或者一個是真的? – rrhartjr

+0

一個基本的邏輯OR條件 –

回答

6

由於您只需要合乎邏輯的OR,因此您只需爲每個屬性使用兩個觸發器。

試試這個XAML:

<StackPanel> 
     <StackPanel.Resources> 
      <Style TargetType="{x:Type Button}"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=InputText, Path=Text}" Value="" > 
         <Setter Property="IsEnabled" Value="False" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Path=MyIsEnabled}" Value="False" > 
         <Setter Property="IsEnabled" Value="False" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </StackPanel.Resources> 
     <StackPanel Orientation="Horizontal"> 
      <Label>MyIsEnabled</Label> 
      <CheckBox IsChecked="{Binding Path=MyIsEnabled}" /> 
     </StackPanel> 
     <TextBox Name="InputText">A block of text.</TextBox> 
     <Button Name="TheButton" Content="A big button.">  
     </Button> 
    </StackPanel> 

我設置DataContextWindow類具有DependencyProperty稱爲MyIsEnabled。顯然你將不得不修改你的特定DataContext

下面是相關的代碼隱藏:

public bool MyIsEnabled 
{ 
    get { return (bool)GetValue(IsEnabledProperty); } 
    set { SetValue(IsEnabledProperty, value); } 
} 

public static readonly DependencyProperty MyIsEnabledProperty = 
    DependencyProperty.Register("MyIsEnabled", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(true)); 


public MainWindow() 
{ 
    InitializeComponent(); 
    this.DataContext = this; 
} 

希望幫助!

1

綁定IsEnabled使用MultiBinding

+0

我試過,但Multibinding不可用於IsEnable,除非我做錯了什麼 –

+1

IsEnabled,而不是IsEnable?難道你不會在你的綁定中輸入錯誤嗎?添加一些XAML到你的問題。 –

+0

這就是我目前的做法。但我不想用ContentControl來包裝每一個控件。我嘗試設置上面顯示的樣式示例,但是這弄亂了我正在使用的主題。由於我仍然在學習WPF,所以我想知道哪些選項可用。 –

7

正如GazTheDestroyer說,你可以使用MultiBinding。

You can also acomplish this with XAML-only solution using MultiDataTrigger

但是你應該切換條件導致觸發器只支持平等

<Style.Triggers> 
    <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=Text.Length}" Value="0" /> 
      <Condition Binding="{Binding Source=... Path=IsEnabled}" Value="False" /> 
     </MultiDataTrigger.Conditions> 
     <Setter Property="IsEnabled" Value="False" /> 
     </MultiDataTrigger> 
</Style.Triggers> 

如果條件之一不滿足被設置爲缺省值或從樣式值。但不要設置本地值,因爲它會覆蓋樣式和觸發器的值。

+0

這將導致這些值的AND。你可以簡單地爲每個屬性分配兩個'Trigger'。另外,你需要綁定到一個'TextBox'的'Text.Length',而不是'Self'。 – rrhartjr

+0

是的,這是AND,但Keith需要OR,因爲沒有切換變體。無論是user.IsEnabled或Text.Length> 0來啓用TextBox。看到這個問題的評論。 –