Question

Using Button in DataTemplate, binding Command & Label

Posted 6 years ago by Avatar Phil Devaney - Senior Software Engineer, Serck Controls Ltd
I am trying to use a Button in a DataTemplate and specify a binding on both the Command and Label properties, but if the command is a RibbonCommand with a label specified, the Command's label is displayed instead of the Button's label. If I bind both properties in a non-templated context, then the Button's label overrides the Command's label as expected.

Here's an example:
<Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:r="http://schemas.actiprosoftware.com/winfx/xaml/ribbon"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="Window1" SizeToContent="WidthAndHeight">
  
  <Window.CommandBindings>
    <CommandBinding Command="local:Window1.FooCommand" Executed="FooCommand_Execute" />
  </Window.CommandBindings>
  
  <Window.Resources>
    <DataTemplate DataType="{x:Type local:Foo}">
      <r:Button Margin="5" Padding="5" HorizontalContentAlignment="Center" 
                Label="{Binding Name}" Command="{Binding Command}" />
    </DataTemplate>
  </Window.Resources>

  <StackPanel>
    <r:Button Margin="5" Padding="5" HorizontalContentAlignment="Center" 
              Label="{Binding Name}" Command="{Binding Command}" />
    
    <ContentControl Content="{Binding}" />
  </StackPanel>
  
</Window>
using System;
using System.Windows;
using System.Windows.Input;

using ActiproSoftware.Windows.Controls.Ribbon.Input;

namespace WpfApplication1
{
  public partial class Window1 : Window
  {
    public Window1()
    {
      this.DataContext = new Foo() { Name = "Foo 1" };
      this.InitializeComponent();
    }

    public static readonly RibbonCommand FooCommand =
      new RibbonCommand( "FooCommand", typeof( Foo ), "Foo Command" );

    private void FooCommand_Execute( object sender, ExecutedRoutedEventArgs e )
    {
      MessageBox.Show( "Foo Executed" );
    }
  }

  public class Foo
  {
    public string Name { get; set; }

    public RibbonCommand Command
    {
      get { return Window1.FooCommand; }
    }
  }
}
My actual scenario involves an ItemsControl, with multiple buttons using the same command but with different labels, but this is simpler. I also want to be able to use the same command elsewhere in the UI without overriding its label. Note that if the RibbonCommand doesn't have a label, then the Button label is displayed even when templated.

Phil

Comments (2)

Posted 6 years ago by Actipro Software Support - Cleveland, OH, USA
Hi Phil,

Can you send this over via email to us as a simple sample project that we can debug? Thanks!

Actipro Software Support
Posted 6 years ago by Actipro Software Support - Cleveland, OH, USA
Phil,

Thanks for reporting this and supplying the sample project. We've altered our internal code to implement command UI providers a bit different and the change resolves the issue. The maintenance release with the updates was just posted.

Actipro Software Support
Information The latest build of this product (2014.1 build 0602) was released 1 month ago, which was after the last post in this thread.

Add a Comment

Please log in to a validated account to post comments.