2012-04-11 47 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