2012-04-11 46 views
0

我有一個mvvm設計模式設置爲執行命令和工作區,以便按下按鈕並顯示正確的工作區。這些按鈕具有模板綁定功能,可根據命令爲模板提供適當的圖像。我已經爲SelectedTemplateResource的命令添加了另一個字段,用於在按鈕陣列中選擇按鈕時。 DataTemplate被拉入主窗口以顯示按鈕。選擇按鈕模板樣式

<DataTemplate x:Key="CommandsTemplate"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Button Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}"> 
        <Button.Style> 
         <Style TargetType="Button"> 
          <Style.Triggers> 
           <DataTrigger Binding="{Binding Path=Command}"> 
            <Setter Property="Template"> 
             <Setter.Value> 

             </Setter.Value> 
            </Setter> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Button.Style> 
       </Button> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</DataTemplate> 

想我想要做的就是二傳手的值設置爲SelectedTemplateResource像這樣在所謂TemplateResource按鈕的模板。這些都是通過mainwindowviewmodel處理來爲每個按鈕設置適當的模板,並且它運行良好,但我不知道如何完成選定的狀態。

此外,我不完全確定是否應該將datatrigger綁定到命令路徑。

任何人都可以幫助我弄清楚如何使用上面提到的設計來設置按鈕的選定狀態嗎?

乾杯。

編輯 我得到了togglebutton觸發器的使用,但綁定不起作用。至於一些原因,我不斷收到鍵下面有一些更多的信息在我app.xaml.cs

零誤差切換按鈕是在一個名爲MainWindowResources.xaml(資源字典)文件一個DataTemplate。 MainWindow.xaml文件引入此數據模板。 我有一個bindableresource類來幫助資源文件的靜態資源。

public class BindableResource : StaticResourceExtension 
{ 
    #region Fields 
    private static readonly DependencyProperty dummyProperty; 
    #endregion 


    #region Properties 
    /// <summary> 
    /// Gets and sets my binding. 
    /// </summary> 
    public Binding MyBinding { get; set; } 
    #endregion 


    #region Constructor 
    /// <summary> 
    /// Static contruction of the dummy dependency property. 
    /// </summary> 
    static BindableResource() 
    { 
     dummyProperty = DependencyProperty.RegisterAttached("Dummy", typeof(string), typeof(DependencyObject), new UIPropertyMetadata(null)); 
    } 

    /// <summary> 
    /// Constructor. 
    /// </summary> 
    public BindableResource() 
    { 
    } 

    /// <summary> 
    /// Constructor with binding to set. 
    /// </summary> 
    /// <param name="binding"></param> 
    public BindableResource(Binding binding) 
    { 
     MyBinding = binding; 
    } 
    #endregion 


    #region External Members 
    /// <summary> 
    /// Get the resource key to bind to the resource. 
    /// </summary> 
    /// <param name="serviceProvider"></param> 
    /// <returns></returns> 
    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     var target = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
     var targetObject = (FrameworkElement)target.TargetObject; 

     MyBinding.Source = targetObject.DataContext; 
     var DummyDO = new DependencyObject(); 
     BindingOperations.SetBinding(DummyDO, dummyProperty, MyBinding); 

     ResourceKey = DummyDO.GetValue(dummyProperty); 

     return base.ProvideValue(serviceProvider); 
    } 
    #endregion 
} 

但是,這不適用於觸發器設置值。

<DataTemplate> 
       <ToggleButton Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}"> 
        <ToggleButton.Style> 
         <Style TargetType="ToggleButton"> 
          <Style.Triggers> 
           <Trigger Property="IsChecked" Value="True"> 
            <Setter Property="Template" Value="{Utilities:BindableResource {Binding Path=SelectedTemplateResource}}" /> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </ToggleButton.Style> 
       </ToggleButton> 
      </DataTemplate> 

任何想法或想法?

回答

0

找出後這真的是不可能的我帶出了C#純XAML做,創建一個自定義控制......這是很基本的,可以得到改善,我將不得不改變一點但最終自定義控件解決了這個問題,以便您可以從資源字典中點擊單擊事件並即時更改模板。

public class TabButton : Button 
{ 
    public static readonly DependencyProperty SelectedTemplateProperty = 
     DependencyProperty.Register("SelectedTemplate", typeof(ControlTemplate), typeof(TabButton)); 

    public ControlTemplate SelectedTemplate 
    { 
     get { return base.GetValue(SelectedTemplateProperty) as ControlTemplate; } 
     set { base.SetValue(SelectedTemplateProperty, value); } 
    } 

    public TabButton() 
    { 
     this.Click += new RoutedEventHandler(TabButton_Click); 
    } 

    ~TabButton() 
    { 

    } 

    public void TabButton_Click(object sender, RoutedEventArgs e) 
    { 
     ControlTemplate template = (ControlTemplate)this.FindResource("Environmental Template Selected"); 
     (sender as TabButton).Template = template; 
    } 
} 

乾杯。

2

我不確定我已經明白你想要什麼。如果選擇是,你想改變按鈕的模板嗎?

首先,標準按鈕沒有「被選中」的概念。你想要一個ToggleButton。這樣你可以觸發IsChecked屬性來設置你的模板。

<DataTemplate x:Key="CommandsTemplate"> 
    <ItemsControl ItemsSource="{Binding}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Orientation="Horizontal" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ToggleButton Command="{Binding Path=Command}" Content="{Binding Path=DisplayName}" Template="{Utilities:BindableResource {Binding Path=TemplateResource}}"> 
        <ToggleButton.Style> 
         <Style TargetType="ToggleButton"> 
          <Style.Triggers> 
           <Trigger Property="IsChecked" Value="True"> 
            <Setter Property="Template" Value="{Utilities:BindableResource {Binding DataContext.SelectedTemplateResource}}"> 
           </Trigger> 
          </Style.Triggers> 
         </Style> 
        </ToggleButton.Style> 
       </ToggleButton> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</DataTemplate> 
+0

這正是我正在尋找的,切換按鈕確實更有意義,但是當點擊按鈕時模板不會切換。 – bl4kh4k 2012-04-11 15:38:26

+0

你可以檢查你的輸出是否有綁定錯誤。我只是猜測了二傳手的綁定路徑。 – GazTheDestroyer 2012-04-11 15:40:15

+0

一直說輸出控制檯沒有任何內容......該方法看起來正確,可能只是一個愚蠢的綁定約束。 – bl4kh4k 2012-04-11 15:46:38