Masuri
Masuri

Reputation: 1136

RelativeSource never called

I want to bind a command which is in the code behind to user control button(ICommand) which is in UserControl.Resources

So I wrote a code using RelativeSource. But It didn't work.

I tried to solve this using converter for debugging.

But even this wasn't called.

Here is the code I made. Please tell me if I'm wrong.

Thank you.

XAML

<UserControl x:Class="Views.Common.SubMenuPanel"
             xmlns:controls="...."                
             ....
             mc:Ignorable="d">

<UserControl.Resources>            
    <controls:SubMenuButton x:Key="TerminateSystem" 
                            ButtonName="Terminate System" 
      [[DOESN'T WORK]] -->  Execute="{Binding RelativeSource={RelativeSource  AncestorType={x:Type UserControl}}, Path=TerminateSystemCommand
                                    , Converter={StaticResource DebugDummyConverter}}"
                            ImageURI="...png"/>       

    <CollectionViewSource x:Key="LoginViewSubMenuItems">
        <CollectionViewSource.Source>
            <system:ArrayList>
                <StaticResource ResourceKey="TerminateSystem"/>
            </system:ArrayList>
        </CollectionViewSource.Source>
    </CollectionViewSource>
</UserControl.Resources>

<Grid>
   <ListBox ItemsSource="{Binding Source={StaticResource LoginViewSubMenuItems}}"/>
</Grid>

Code Behind

public partial class SubMenuPanel : UserControl
{
     public ICommand TerminateSystemCommand => new RelayCommand(() => Do Something);

     public SubMenuPanel()
     {
        InitializeComponent();

        this.DataContext = this;
     }
}

Upvotes: 0

Views: 48

Answers (1)

Ivan Vargas
Ivan Vargas

Reputation: 703

You are binding the ICommand to an Execute property. The property you should be binding to is Command, i.e.

<controls:SubMenuButton x:Key="TerminateSystem" 
                        ButtonName="Terminate System" 
                        Command="{Binding RelativeSource={RelativeSource  AncestorType= 
                                 {x:Type UserControl}}, Path=TerminateSystemCommand
                                    , Converter={StaticResource DebugDummyConverter}}"
                       ImageURI="...png"/> 

Assuming the other properties in the button are not causing other issues, that should resolve it.

EDIT:

I am including the code I have verified to work. Since I don't have your definition for SubMenuButton, I just used a Button instead:

XAML:

<UserControl.Resources>
    <Button x:Key="TerminateSystem" 
            Command="{Binding RelativeSource={RelativeSource  AncestorType={x:Type UserControl}}, Path=TerminateSystemCommand}">
        Say Hello World!!!!
    </Button>
    <CollectionViewSource x:Key="LoginViewSubMenuItems">
        <CollectionViewSource.Source>
            <system:ArrayList>
                <StaticResource ResourceKey="TerminateSystem"/>
            </system:ArrayList>
        </CollectionViewSource.Source>
    </CollectionViewSource>            
</UserControl.Resources>

<Grid>
    <ListBox ItemsSource="{Binding Source={StaticResource LoginViewSubMenuItems}}"/>
</Grid>

Code behind:

public ICommand TerminateSystemCommand =>
        new RelayCommand(() => Console.WriteLine("Hello World!!!"));

Upvotes: 1

Related Questions