2013-11-14 33 views
0

我有一個ItemsControl控件顯示一些按鈕。 當我點擊其中一個按鈕時,我必須顯示所選資源的某些細節(綁定到按鈕)。如何使用觸發器突出顯示XAML中的按鈕?

所以當點擊按鈕時,我在ViewModel上設置了一個名爲SelectedResource的屬性。

這工作正常,我想要做的是突出顯示按鈕點擊。

我有一個控件模板爲我的按鈕,如下:

<ControlTemplate x:Key="ResourceButtonTemplate" TargetType="{x:Type ButtonBase}"> 
    <Border Name="SelectedButtonBorder" 
      CornerRadius="3"> 
     <Border x:Name="border" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      BorderThickness="{TemplateBinding BorderThickness}" 
      CornerRadius="3" 
      Background="{TemplateBinding Background}" 
      SnapsToDevicePixels="True"> 
      <StackPanel Orientation="Horizontal" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"> 
       <Image Source="{Binding Type.Value, Converter={converter:ResourceTypeToStringConverter}}"></Image> 
       <ContentPresenter x:Name="contentPresenter" 
           ContentTemplate="{TemplateBinding ContentTemplate}" 
           Content="{TemplateBinding Content}" 
           ContentStringFormat="{TemplateBinding ContentStringFormat}" 
           Focusable="False" 
           Margin="{TemplateBinding Padding}" 
           RecognizesAccessKey="True" 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
      </StackPanel> 
     </Border> 
    </Border> 
    <ControlTemplate.Triggers> 
     <DataTrigger Binding="{Binding SelectedResource}" Value=""> 
      <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" /> 
      <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" /> 
     </DataTrigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

我已經試過了DataTrigger,但我不能datatrigger的價值屬性綁定。

那麼,有沒有辦法做到這一點只使用XAML?

編輯:

我不想比較SelectedResource爲空字符串,其實我不知道是什麼來比較。我試圖將SelectedResource對象的一個​​屬性與按鈕上顯示的文本進行比較。

+0

是選定的資源一個字符串,發佈cs。 SelectedResource的代碼。 –

+0

難道你沒有在輸出窗口中看到一個錯誤,說'對象???(可能'Button')'找不到屬性'SelectedResource'? – Sheridan

+0

Selected不是一個字符串,但它有一個字符串屬性,我用它來顯示按鈕的內容。我試圖比較兩個,但它沒有工作 – vintem

回答

0

假設每個按鈕的DataContext是一個給定的Resource,即在datatrigger綁定失敗。

我會在Resource類中有一個bool屬性IsSelected。那麼你的觸發應該是這樣的:

<DataTrigger Binding="{Binding IsSelected}" Value="True"> 
    <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" /> 
    <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" /> 
</DataTrigger> 

當然,你如果只有一個可以一次選擇處理項目的取消選擇。

0

假設你已經正確設置你的觀點的DataContext到您的視圖模型的實例,你應該能夠使用RelativeSource Binding這樣的訪問SelectedResource屬性:

<DataTrigger Binding="{Binding DataContext.SelectedResource, 
    RelativeSource={RelativeSource AncestorType={x:Type 
    YourViewsNamespacePrefix:YourUserControl}}}" Value=""> 
    <Setter TargetName="SelectedButtonBorder" Property="BorderBrush" Value="Red" /> 
    <Setter TargetName="SelectedButtonBorder" Property="BorderThickness" Value="2" /> 
</DataTrigger> 

使用此Binding中,框架將查找類型爲YourUserControlButton的父級,並在發現該父級時,它將查看設置爲其DataContext的對象,最後在該對象中查找名爲SelectedResource的屬性。


UPDATE >>>

這真的不要緊,珍惜你使用,只要你使用的值。你點擊按鈕時說我在ViewModel上設置一個名爲SelectedResource的屬性。假設您將Button.Name的值存儲在SelectedResource中,然後是您在DataTrigger中存儲的值。當然,你需要創建一個稍微不同的DataTrigger每個Button

<DataTrigger Binding="{Binding DataContext.SelectedResource, 
    RelativeSource={RelativeSource AncestorType={x:Type 
    YourViewsNamespacePrefix:YourUserControl}}}" Value="Button1"> 
    ... 
</DataTrigger> 
... 
<DataTrigger Binding="{Binding DataContext.SelectedResource, 
    RelativeSource={RelativeSource AncestorType={x:Type 
    YourViewsNamespacePrefix:YourUserControl}}}" Value="Button8"> 
    ... 
</DataTrigger> 

的問題,你將不得不是,你可以不使用ItemsControl顯示您Button元素。

+0

我想我沒有讓自己清楚,所以我編輯了這個問題。我不想和一個空字符串進行比較,這就是我不知道應該放在datatrigger的value屬性上的問題,因爲它不能是一個固定值。 – vintem

+0

這是行不通的,因爲我的按鈕是根據我在數據庫中的內容動態創建的。 – vintem

0

還是你嘗試這樣的事:

<Button> 
      <Button.Style> 
       <Style TargetType="{x:Type Button}"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding SelectedResource}" Value="1"> 
          <Setter Property="Background" Value="Red" /> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding SelectedResource}" Value="2"> 
          <Setter Property="Background" Value="White" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </Button.Style> 
     </Button>