2010-03-10 172 views
2

當我的文本框的文本框屬性Validation.HasErrorsTrue時,我想使用某種觸發器將窗口中的按鈕更改爲IsEnabled = False根據其他控件中的屬性更改屬性 - WPF

我可以在Button上使用某種觸發器嗎?

如果是的話,一些例子會很好!

+0

WPF TextBox對象沒有Validation屬性 - 我錯過了什麼嗎? – Jake 2010-03-10 23:58:43

+0

傑克:你錯過了Validation.HasError附加屬性。 – itowlson 2010-03-11 00:00:58

+1

@itowlson:謝謝,張貼在此情況下,我不是一個誰還有東西需要學習有關WPF的唯一的人;) http://msdn.microsoft.com/en-us/library/system.windows.controls .validation.haserror.aspx – Jake 2010-03-11 00:45:47

回答

4

您可以通過使用樣式來做到這一點。如果您想直接比分扳成文本框,你可以做這樣的事情:

<Style x:Key="DisabledOnErrors" TargetType="{x:Type Button}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding (Validation.HasErrors)}" Value="True"> 
       <Setter Property="IsEnabled" Value="False"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

<TextBox x:Name="myTextBox" /> 
    <Button Style="{StaticResource DisabledOnErrors}" 
      DataContext="{Binding ElementName=myTextBox}" /> 

這工作如果按鈕是不是已經綁定到DataContext的其他屬性。在這種情況下,樣式可以重複使用其他按鈕和文本框對。

+0

是否可以將一個按鈕應用於多個文本框? – 2010-03-11 00:39:19

+0

您可以嘗試使用MultiBinding和自定義IMultiValueConverter。我沒有與這些太多的經驗,但總的想法是按鈕的IsEnabled直接綁定的是結合所有的文本框(V​​alidation.HasErrors)一個MultiBinding,使用的ElementName語法如下itowlson顯示。然後,您需要一個IMultiValueConverter,它將獲取一個bool值列表,然後將它們全部組合在一起。 – 2010-03-11 14:34:56

2

是的,你可以用觸發器這樣做,而是因爲你是指另一個元素,你必須使用一個DataTrigger,而不是正常的觸發器:

<Button> 
    <Button.Style> 
    <Style TargetType="Button"> 
     <Style.Triggers> 
     <DataTrigger Binding="{Binding (Validation.HasError), ElementName=tb}" Value="True"> 
      <Setter Property="IsEnabled" Value="False" /> 
     </DataTrigger> 
     </Style.Triggers> 
    </Style> 
    </Button.Style> 
</Button> 

注意,你必須使用一個樣式而不是按鈕.Triggers集合,因爲Button.Triggers只能包含EventTriggers。

+0

我試圖用圖像和可見性屬性,它不起作用。當我使用Button(使用Visibility屬性)時,它確實有效。我無法弄清楚爲什麼。有什麼想法嗎?謝謝,Marc。 – obiwanjacobi 2011-10-21 20:25:39