2011-11-17 165 views
4

我有一個名爲item的類,它只包含兩個屬性。我將在屏幕上將它們顯示爲具有樣式的按鈕。這個問題涉及我如何根據IsSelected值來設置按鈕的樣式,當我想要影響的元素的樣式不是數據模板時。我已經嘗試過使用觸發器,但無法啓動它。使用數據模板中的樣式

該課程如下。

public class Item : ObservableObject 
{ 
    private string _title; 
    private bool _isSelected; 

    public string Title 
    { 
     get { return _title; } 
     set 
     { 
      _title = value; 
      RaisePropertyChanged("Title"); 
     } 
    } 

    public bool IsSelected 
    { 
     get { return _isSelected; } 
     set 
     { 
      _isSelected = value; 
      RaisePropertyChanged("IsSelected"); 
     } 
    } 
} 

我使用數據模板在ItemsControls中顯示這些項目。

<ItemsControl ItemsSource="{Binding Path=Items}" ItemTemplate="{StaticResource ResourceKey=ItemTemplate}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 

使用以下樣式和數據模板。

<Style x:Key="ItemButton" TargetType="Button"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Name="ButtonBorder" BorderThickness="2,2,2,0" BorderBrush="#AAAAAA" CornerRadius="6,6,0,0" Margin="2,20,0,0" Background="Black"> 
        <ContentPresenter 
          VerticalAlignment="Center" 
          HorizontalAlignment="Center"/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
<DataTemplate x:Key="ItemTemplate"> 
    <Button Height="60" Style="{StaticResource ItemButton}" Name="Button"> 
     <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Path=Title}" 
         HorizontalAlignment="Left" Margin="5,5,5,3" FontSize="25" Foreground="#6B6B6B" FontFamily="Arial" /> 
       <Button Style="{StaticResource NoChromeButton}" Margin="0,0,5,0"> 
       <Button.Content> 
        <Image Height="20" Source="/WpfApplication1;component/Image/dialogCloseButton.png"></Image> 
       </Button.Content> 
       <Button.ToolTip> 
        Close  
       </Button.ToolTip> 
      </Button> 
     </StackPanel> 
    </Button> 
</DataTemplate> 

我需要在IsSelected爲True時將對象Item中的「ButtonBorder」背景從黑色更改爲白色。

我已經在觸發加在數據模板 這是不行的,我想它,因爲樣式覆蓋DataTemplate中,因此背景保持白色。但是,當我嘗試在樣式中執行觸發器時,我無法訪問IsSelected屬性?

的DataTemplate觸發

<DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
      <Setter TargetName="Button" Property="Background" Value="White"/> 
     </DataTrigger> 
    </DataTemplate.Triggers> 

風格觸發

<Style.Triggers> 
     <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
      <Setter Property="Background" Value="White"/> 
     </DataTrigger> 
    </Style.Triggers> 

我這麼想嗎?

+0

如果'ItemButton'僅用於'Item'對象,那麼你爲什麼不只是鞏固風格融入'Item'的DataTemplate? –

+0

這是一個公平的評論,我已經習慣了將所有東西都分開到個人資源的習慣,不確定它是否是一種好習慣,但我堅持認爲:) – JonWillis

+0

@jberger它也使得資源和UI佈局更易於閱讀並修改它們是否與內嵌模板和樣式不混淆。 – Rachel

回答

8

讓你ButtonBorder.Background{TemplateBinding Background},這意味着它將使用任何背景顏色被分配到模板按鈕,然後就可以根據觸發

<Style x:Key="ItemButton" TargetType="Button"> 
    <Setter Property="Background" Value="Black" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Border Name="ButtonBorder" Background="{TemplateBinding Background}" ... > 
        <ContentPresenter ... "/> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="SelectableItemButton" TargetType="Button" BasedOn="{StaticResource ItemButton}"> 
    <Setter Property="Background" Value="Black" /> 
    <Style.Triggers> 
     <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
      <Setter Property="Background" Value="White"/> 
     </DataTrigger> 
    </Style.Triggers> 
</Style> 

<DataTemplate x:Key="ItemTemplate"> 
    <Button Height="60" Style="{StaticResource SelectableItemButton}"> 
     ... 
    </Button> 
</DataTemplate> 
更改按鈕的背景

我也做一個SelectableItemButton風格,從ItemButton繼承,並剛剛實現了扳機

+0

這工作的一種享受,我忘了TemplateBinding來自有限的時間與WPF一起工作。但是{Binding IsSelected}是如何知道它與我的對象相關的,而不是像其他GUI控件一樣被選中,如複選框。 – JonWillis

+1

@JonWillis由於您使用的是DataTrigger,如果該值存在並且爲True,則該綁定將查看'Button.DataContext.IsSelected'並更改背景顏色。你可以在技術上做一個Button並給它一個CheckBox對象的DataContext,它可能會工作,雖然我不會推薦:) – Rachel

0

不宜目標是「ButtonBorder」,而不是「按鈕」中:

<Setter TargetName="Button".... 

此外,要訪問IsSelected你需要設置樣式中TargetType財產....

+0

你是對的我錯了,但是。 TargetName不起作用。在DataTemplate中ButtonBorder不存在,因爲該名稱在樣式中定義。在樣式中,TargetName不是在觸發器中使用的有效屬性(所以Visual Studio告訴我)。 – JonWillis

+0

TargetType在樣式上設置,它被設置爲「Button」。數據模板創建一個按鈕及其中的內容,然後它創建的按鈕將應用ItemButton樣式。 – JonWillis

相關問題