2015-09-14 71 views
2

我有表單的多個datatriggers:從樣式設置器中取消選中複選框?

<Style x:Key="VerifyCheckBox" TargetType="{x:Type CheckBox}"> 
      <Setter Property="Height" Value="14" /> 
      <Setter Property="FontSize" Value="12" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=PrimaryInsuranceCompany, Path=(Validation.HasError)}" Value="True"> 
        <Setter Property="IsEnabled" Value="False" /> 
        <Setter Property="IsChecked" Value="False" /> 
       </DataTrigger> 

複選框IsEnabled屬性設置正確。但是,IsChecked屬性不會取消選中,如果它已被首先手動檢查。

IsChecked可以從Setter中取消選中嗎?

編輯#1

To complicate matters a bit more, the checkbox is bound to a property in my viewmodel as: 

    <CheckBox 
        Style="{StaticResource VerifyCheckBox}" 
        IsChecked="{Binding PrimaryInsurance.SelectedInsurance.Verify}" 
        Content="Verify" HorizontalAlignment="Left" Margin="789,92,0,676" Width="46" /> 

而且有多個DataTrigger S IN的Style.Triggers每個檢查在UI上不同的元件。總之,UI具有所有的數據驗證。例如,上面提到的元素,PrimaryInsuranceCompany是:

<wc:AutoFilteredComboBox 
        Name="PrimaryInsuranceCompany" 
        IsEnabled="{Binding PrimaryInsurance.Enabled}" 
        ItemsSource="{Binding PrimaryInsurance.AllCompanies}" 
        ItemTemplate="{StaticResource CompanyTemplate}" 
        IsEditable="True" 
        IsCaseSensitive="False" 
        IsTextSearchEnabled="True" 
        TextSearch.TextPath="Companyname" 
        Text="{Binding PrimaryInsurance.NewCompanyName, UpdateSourceTrigger=PropertyChanged}" 
        theFilter="{Binding PrimaryInsurance.TheFilter}" 
        SelectedItem="{Binding PrimaryInsurance.SelectedInsurance.Company}" 
        h:ComboBoxRegexValidator.RegexText="{x:Static h:RegexLibrary.NonEmptyRegex}" 
        HorizontalAlignment="Left" Margin="590,138,0,0" VerticalAlignment="Top" Width="363" /> 

因此,在特定的組合框元素,我試圖避免重複在視圖模型的驗證過程,因爲它已經直接在視圖中進行。這可以做到嗎?

+0

IsChecked屬性肯定會綁定到某些視圖模型屬性。 – Clemens

+0

@Clemens是的......是的。請看我上面的編輯。 :) –

回答

3

這很容易引起混淆。你可能想讀這個:https://msdn.microsoft.com/en-us/library/vstudio/ms743230%28v=vs.100%29.aspx。 基本上,wpf中的依賴項屬性可以在不同的地方設置:local(IsChecked = True),style,in trigger等等。當屬性設置在多個位置時,將使用特定的分辨率順序來解決衝突。這裏有一個例子:本地(=器isChecked真)和觸發:

<Window.Resources> 
    <Style x:Key="VerifyCheckBox" TargetType="{x:Type CheckBox}"> 
     <Setter Property="Height" Value="14" /> 
     <Setter Property="FontSize" Value="12" /> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding TestValue}" Value="True"> 
       <Setter Property="IsChecked" Value="False" /> 
       <Setter Property="IsEnabled" Value="False" />      
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<CheckBox Content="Hey there" IsChecked="True" Style="{StaticResource VerifyCheckBox}" /> 

在這裏,我們地設立器isChecked。本地值具有更高的優先級,因此,當TestValue將變爲true時,複選框而不是將被取消選中。然而,我們並沒有在本地設置IsEnabled,所以它會從觸發器中獲得它的值。請注意,如果我們確實在在本地設置了IsEnabled = True,則觸發器根本無效。

現在讓我們嘗試這樣的:

<Window.Resources> 
    <Style x:Key="VerifyCheckBox" TargetType="{x:Type CheckBox}"> 
     <Setter Property="Height" Value="14" /> 
     <Setter Property="FontSize" Value="12" /> 
     <Setter Property="IsChecked" Value="True"></Setter> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding TestValue}" Value="True"> 
       <Setter Property="IsChecked" Value="False" /> 
       <Setter Property="IsEnabled" Value="False" />      
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Window.Resources> 
<CheckBox Content="Hey there" Style="{StaticResource VerifyCheckBox}" /> 

我們搬到在器isChecked風格初始二傳手,現在它按預期工作,因爲觸發了風格二傳手值具有優先權。

更新:用戶點擊不會改變上面的行爲。所以,如果你有本地的IsChecked = True,那麼用戶點擊兩次,然後TestValue成爲true - 它不會被取消選中。如果你這樣做,但在樣式設置器中初始化IsChecked = True - 它將被取消選中。

+0

只是出於好奇......而如果用戶點擊「CheckBox」,因此「IsChecked」屬性發生了變化呢?這是否也覆蓋了樣式或觸發器上的值?或者它不影響他們? – almulo

+0

更新和回覆您的評論。 – Evk

+0

@Evk如果CheckBox IsChecked dp被綁定到viewmodel上的一個屬性,它會初始化它會發生什麼?很好的答案btw。謝謝。 –