2013-11-27 104 views
0

我正在使用IDataErrorInfo爲某些值實現一些基本邏輯驗證。這似乎很好地工作,而且我使用的是contentpresenter來顯示結果:使用IDataErrorInfo進行驗證

<ContentPresenter Content="{ Binding ElementName =MyElement, Path=(Validation.Errors).CurrentItem}" 
           HorizontalAlignment ="Left"> 
    <ContentPresenter.ContentTemplate> 
      <DataTemplate> 
       <TextBlock Foreground ="Red" FontStyle="Italic" Text="{ Binding Path =ErrorContent}" /> 
      </DataTemplate> 
    </ContentPresenter.ContentTemplate> 
</ContentPresenter> 

我得到一個不錯的紅色消息時,有一個問題,有問題的領域是正確的高亮顯示。但是,如果發生這種情況,我想禁用表單的保存按鈕。這是我到目前爲止已經試過(沒有成功):

<Button Content="Save" Click ="MyButton_Click" 
      IsEnabled="{Binding Converter={StaticResource ValidConverter}, ConverterParameter={Binding ElementName=MyElement, Path=(Validation.Errors).CurrentItem}}"/> 

ValidConverter僅僅是一個空或空字符串返回true的轉換器。

我也試過觸發器,像這樣的(嘗試都觸發和DataTrigger):

<Button Content="Save" Click ="MyButton_Click" 
    <Button.Style> 
     <Style>       
      <Style.Triggers> 
       <Setter Property ="Button.IsEnabled" Value="True" /> 
       <DataTrigger Binding ="{ Binding Path=(Validation.HasError)}" Value ="True"> 
        <Setter Property ="Button.IsEnabled" Value="False" /> 
       </ DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ Button.Style> 
</ Button> 

我發現這方面的一些在線信息,而據我可以告訴觸發方法應該工作;但是,如果我使用觸發器,則什麼都不會發生,並且DataTrigger不會編譯(錯誤MC1000:未知構建錯誤,'索引(基於零)必須大於或等於零且小於參數列表的大小)。

有誰能告訴我爲什麼這不起作用,我在這裏做錯了什麼?

+1

'{Binding Path = {Validation.HasError}}'應該是'{Binding Path =(Validation.HasError)}'typo? – Shoe

+0

是 - 錯字...現在修復剛更新的答案 –

回答

0

上面的問題是使用默認:

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

工作正常。正如@Shoe所指出的那樣 - 這個問題出現了一個錯誤 - 現在已經糾正了。

0

嗯...我正在做另一種方式...這裏有一個類似的按鈕,但它是基於幾個驗證的幾個TextBox s和ComboBox需要驗證。

所以,我將默認設置爲false,當所有驗證錯誤都爲false時,將其設置爲true。

<Button x:Name="Btn_Insert" 
     Command="{Binding Insert_Command}" 
     IsDefault="True" 
     > 
    <Button.Style> 
     <Style TargetType="Button"> 
      <Setter Property="IsEnabled" Value="False"/> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=(Validation.HasError), 
            ElementName=txtbx_1}" Value="False"/> 
         <Condition Binding="{Binding Path=(Validation.HasError), 
            ElementName=cmb_1}" Value="False"/> 
         <Condition Binding="{Binding Path=(Validation.HasError), 
            ElementName=txtbx_2}" Value="False"/> 
         <Condition Binding="{Binding Path=(Validation.HasError), 
            ElementName=txtbx_3}" Value="False"/> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="IsEnabled" Value="True"/> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

嘗試也把你的<Setter Property ="Button.IsEnabled" Value="True" /><Style.Triggers>