1

我有一個綁定到CustomerViewModel對象列表的列表框,每一個有兩個依賴屬性:
- 名稱(字符串)
- 描述(字符串)
- ISVISIBLE (布爾)DataTrigger內的ControlTemplate不更新

(IsVisible屬性默認爲true,並通過ToggleVisibility命令反轉的CustomerViewModel)

我想顯示的名稱和說明一個邊境控制權,這是當IsVisible屬性時具有透明背景假的時候y是真的和綠的。

我的問題是,下面的代碼的DataTrigger部分不能按我想要的方式工作,因爲在更改IsVisible時,Setter-part沒有被觸發。

我在做什麼錯?

這裏是我的代碼:

<UserControl.Resources> 
    <Style x:Key="ListBoxStyle" TargetType="{x:Type ListBox}"> 
     <Setter Property="Margin" Value="-1,-1,0,0" /> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="ItemContainerStyle" Value="{DynamicResource ListboxItemStyle}" /> 
     <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Disabled" /> 
    </Style> 

    <Style x:Key="ListboxItemStyle" TargetType="{x:Type ListBoxItem}"> 
     <Setter Property="Background" Value="Transparent" /> 
     <Setter Property="FocusVisualStyle" Value="{x:Null}" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
        <Grid> 
         <Border x:Name="border" Background="{TemplateBinding Background}" BorderBrush="#FFD4D6D5" BorderThickness="0,0,0,1"> 
          <Grid Height="70" Margin="0,0,10,0"> 
           <Grid.RowDefinitions> 
            <RowDefinition Height="10" /> 
            <RowDefinition Height="Auto" /> 
            <RowDefinition /> 
            <RowDefinition Height="10" /> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="Auto" /> 
            <ColumnDefinition /> 
           </Grid.ColumnDefinitions> 
           <Border x:Name="visibilityColumn" Grid.Row="0" Grid.Column="0" Grid.RowSpan="4" Background="Transparent" Width="4" Margin="0,0,4,0" /> 
           <TextBlock x:Name="customerName" Grid.Row="1" Grid.Column="1" Foreground="#FF191919" FontWeight="Bold" Text="{Binding Name}" VerticalAlignment="Top" /> 
           <TextBlock Grid.Row="2" Grid.Column="1" VerticalAlignment="Stretch" Text="{Binding Description}" TextWrapping="Wrap" Foreground="#FFB4B4B4" TextTrimming="CharacterEllipsis" /> 
          </Grid> 
          <Border.ContextMenu> 
           <ContextMenu> 
            <MenuItem Header="Edit..." /> 
            <MenuItem Header="Visible" IsCheckable="True" IsChecked="{Binding IsVisible}" Command="{Binding ToggleVisibility}"/> 
           </ContextMenu> 
          </Border.ContextMenu> 
         </Border> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsMouseOver" Value="True"> 
          <Setter Property="Background" Value="#FFEEEEEE" /> 
         </Trigger> 
         <Trigger Property="IsSelected" Value="True"> 
          <Setter Property="Background" Value="#FFF5F5F5" /> 
          <Setter TargetName="customerName" Property="Foreground" Value="Green" /> 
         </Trigger> 
         <DataTrigger Binding="{Binding IsVisible}" Value="False"> <!--If Value="True" the customerName Border shows up green!--> 
          <Setter Property="Background" Value="Green" /> 
         </DataTrigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</UserControl.Resources> 

<ListBox Style="{StaticResource ListBoxStyle}" ItemsSource="{Binding CustomerViewModels}" /> 

更新:
的DataTrigger確實缺少的TargetName = 「visibilityColumn」 由地精指出。

但是 - 「真實」問題是,這條線:

<MenuItem Header="Visible" IsCheckable="True" IsChecked="{Binding IsVisible}" Command="{Binding ToggleVisibility}"/> 

可檢查的菜單項對器isChecked屬性一個雙向綁定模式,所以我其實是顛倒IsVisiblity兩次 - 通過數據綁定和通過ToggleVisibility命令......哎呦:)

回答

2

嘗試切換這一部分:

<DataTrigger Binding="{Binding IsVisible}" Value="False"> 
    <Setter Property="Background" Value="Green" /> 
</DataTrigger> 

本部分:

<DataTrigger Binding="{Binding IsVisible}" Value="False"> 
    <Setter TargetName="visibilityColumn" Property="Background" Value="Green" /> 
</DataTrigger> 

我想你錯過了你的setter中的TargetName屬性。 (順便說一句,你的IsSelected-和IsMouseOver-觸發器)

希望這有助於!

+0

嗨 - 嘗試在DataTrigger setter中添加TargetName屬性,但不幸的是,它沒有做任何事情。 我不認爲這是「常規」觸發器所需要的,因爲它們按預期工作?但我可能是錯的:) – kennethkryger 2010-06-17 09:46:44

+0

哦 - 你想它適用於最外層的網格?並且您的NotifyPropertyChanged事件在ViewModel中觸發?很高興看到圍繞IsVisible的ViewModel實現。 – Goblin 2010-06-17 10:07:24

+0

好 - 哥布林的回答是問題最少的問題,所以我將其標記爲公認的答案。原始問題已通過完整解決方案進行更新。 – kennethkryger 2010-06-17 12:09:19