How to use the text of a routed command as button content
Asked Answered
F

4

7

I have a button on a view that is bound via a RoutedUICommand to a command defined in the ViewModel.

The XAML code excerpt from the view:

<Button Content="Login" Command="{Binding Login}" />

In the View's CodeBehind I add the command binding from the ViewModel to the view's binding collection:

this.CommandBindings.Add( viewModel.LoginCommandBinding );

The ViewModel itself implements the command:

public class LoginViewModel:ViewModelBase
{

    public ICommand Login { get; private set; }
    public CommandBinding LoginCommandBinding { get; private set; }

    public LoginViewModel( ) {
        this.Login = 
            new RoutedUICommand( "Login", "Login", typeof( Window ) );
        this.LoginCommandBinding = 
            new CommandBinding( Login, LoginCommandHandler, CanExecuteHandler );
    }

    void LoginCommandHandler( object sender, ExecutedRoutedEventArgs e ) {
        //Put code here
    }

    void CanExecuteHandler( object sender, CanExecuteRoutedEventArgs e ) {
        return true;
    }
}

So the command was defined with the text and name both "Login". The button itself has the content "Login". Is there a way to use the command's text as the button's content?

Floro answered 22/9, 2010 at 13:9 Comment(0)
C
4

Just bind to the Name or Text property in the command, like so:

        <Button x:Name="btnName"
                Command="{Binding ThisIsMyCommand}"
                Content="{Binding ThisIsMyCommand.Name}" />

        <Button x:Name="btnText"
                Command="{Binding ThisIsMyCommand}"
                Content="{Binding ThisIsMyCommand.Text}" />
Certified answered 22/9, 2010 at 13:23 Comment(0)
U
16

You can get the command text dynamically for every button.

Put this in your Application.xaml file.

<Style TargetType="Button">
  <!--Default Button content to be the Text provided from the Command.-->
  <Setter Property="Content" 
          Value="{Binding RelativeSource={RelativeSource Self}, 
           Path=Command.Text}"/>
</Style>

From...

http://leecampbell.blogspot.com/2008/12/wpf-commandtext.html

Urethritis answered 19/6, 2012 at 16:24 Comment(0)
T
8

A good way to achieve this is to bind it back using the RelativeSource markup extension e.g., Command="Cmds:MyCommands.TestCmd" Content="{Binding RelativeSource={RelativeSource Self}, Path=Command.Text}"

Towboat answered 12/1, 2012 at 20:49 Comment(0)
C
4

Just bind to the Name or Text property in the command, like so:

        <Button x:Name="btnName"
                Command="{Binding ThisIsMyCommand}"
                Content="{Binding ThisIsMyCommand.Name}" />

        <Button x:Name="btnText"
                Command="{Binding ThisIsMyCommand}"
                Content="{Binding ThisIsMyCommand.Text}" />
Certified answered 22/9, 2010 at 13:23 Comment(0)
D
0

I don't have the infrastructure to test this right now, but my souvenir of this issue is that the button should automatically use the RoutedUICommand text as its content.

Have you tried removing the Content property ?

Doreendorelia answered 22/9, 2010 at 13:25 Comment(1)
Yes, I have heard that this should work. That is the reason I'm asking. And no, removing the Content property from the xaml code doesn't do the trick. The button stays empty.Floro

© 2022 - 2024 — McMap. All rights reserved.