2012-11-06 153 views
0

我有下面的按鈕XAML動態更新WPF數據模板

<Button Name="btnLogoff" DockPanel.Dock="Left" Click="btnToolbar_Click" CommandParameter="LOGOFF" 
        Template="{DynamicResource ToolbarButton}" 
         Style="{StaticResource ToolbarButtonDisplay}" z:ButtonProperties.Image="..\..\Resources\Images\Logoff.GIF" Content="Logoff"> 
       </Button> 

ButtonProperties如下

public class ButtonProperties 
    { 
     public static ImageSource GetImage(DependencyObject obj) 
     { 
      return (ImageSource) obj.GetValue(ImageProperty); 
     } 

     public static void SetImage(DependencyObject obj, ImageSource value) 
     { 
      obj.SetValue(ImageProperty, value); 
     } 

     public static readonly DependencyProperty ImageProperty = DependencyProperty.RegisterAttached("Image", typeof(ImageSource), typeof(ButtonProperties), new UIPropertyMetadata((ImageSource)null)); 
    } 

的正常工作,給我的按鈕模板我可以在整個應用程序使用有一個圖像和文本組件。

我想要做的就是在某些後臺線程方法上動態地將ToolbarButton的樣式更改爲ToolbarButtonRed,比如通知用戶事件即將發生,按鈕將變爲紅色樣式。這兩種樣式都在XAML頁面的資源中,但我不知道如何以編程方式更改模板。

我已經試過..

 public DataTemplate AlarmTemplate 
     { 
      get 
      { 
       if (_alarmTemplate != null) 
        return _alarmTemplate; 
       else 
        return (DataTemplate)_parent.FindResource("ToolbarButton"); 
      } 
      set 
      { 
       _alarmTemplate = value; 
       OnPropertyChanged("AlarmTemplate"); 
      } 
     } 


private void SetAlarmIcon(bool red) 
     { 
      if (red) 
       AlarmTemplate = (DataTemplate)_parent.FindResource("ToolbarButtonRed"); 
      else 
       AlarmTemplate = (DataTemplate)_parent.FindResource("ToolbarButton"); 
     } 

並綁定XAML這樣

,但沒有喜悅。該按鈕甚至不顯示。有什麼建議麼?

UPDATE:

風格低於

<Style x:Key="ToolbarButtonDisplay" TargetType="Button"> 
     <Setter Property="ContentTemplate"> 
      <Setter.Value> 
       <DataTemplate> 
        <StackPanel Orientation="Vertical"> 
         <Image Source="{Binding Path=(Windows:ButtonProperties.Image), RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}" Margin="0,2,0,0" Width="32"/> 
         <TextBlock FontSize="9" FontWeight="Normal" FontFamily="Arial" Foreground="White" HorizontalAlignment="Center" Margin="2,2,2,2"> 
           <ContentPresenter Content="{Binding Path=Content, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"></ContentPresenter> 
         </TextBlock> 
        </StackPanel> 
       </DataTemplate> 
      </Setter.Value> 
     </Setter> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding Path=IsEnabled}" Value="True"> 
       <Setter Property="Template" Value="{StaticResource ToolbarButtonRed}"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 

最後更新 - 我有一個觸發如下

<Style.Triggers> 
      <DataTrigger Binding="{Binding Path=DisplayToolbar}" Value="True"> 
       <Setter Property="Template" Value="{DynamicResource ToolbarButtonRed}"/> 
      </DataTrigger> 
     </Style.Triggers> 

上班只要使用上的datacontext(DisplayToolbar)任意財產我不知道如何做到這一點特定於一個按鈕。爲了解釋,我在頁面上有大約30個按鈕,它們都使用相同的樣式,因此使用相同的觸發器,因此上面的代碼將全部設置爲紅色。我需要一種方法來讓每個按鈕鍛鍊IT和IT是否應該是紅色的,所以我正在考慮設置按鈕控件的某些屬性(如果有我可以使用的),並讓數據觸發器查看按鈕屬性,而不是datacontexts。什麼是綁定到按鈕自己的屬性,而不是datacontext的語法?

回答

0

它應該與將Style屬性設置爲FindResource中的值一樣簡單。

Dispatcher.Invoke(() => { btnLogoff.Style = (Style)FindResource("ToolbarButtonRed"); }); 

調度程序調用在此處使用,因爲您無法在後臺線程的控件上設置依賴項屬性。

根據以下評論,可以完全相同的方式設置控件模板。

Dispatcher.Invoke(() => { btnLogoff.Template = (ControlTemplate)FindResource("ToolbarButtonRed"); }); 
+0

對不起,我應該指定的ToolBarButton和ToolbarButtonRed是CONTROLTEMPLATES,沒有風格 – NZJames

+0

如果我理解正確的問題,編輯應該是你所需要的。 – Andy

+0

我試圖通過MVVM做到這一點,所以如果可能的話避免直接的btn屬性更改,最好是更新一個依賴項屬性,然後會影響GUI。你可以不使用調度程序調用來更新GUI線程上的依賴項屬性嗎?因爲這是我最初的做法,但那並不奏效。另外,我已經發布了上面的按鈕樣式定義,並通過數據觸發器添加到塊中,這可能嗎?我做了什麼錯誤,因爲它似乎沒有工作。 – NZJames