Binding a button to both a function and close event wpf

276 views Asked by At

I have a UserControl which is binded to a ViewModel class.

I also have a class which contains a Command for closing a window.

In my UserControl I have two buttons: Save and Cancel.

My Cancel button is binded to the CloseWindow Command and when I click it, the UserControl is indeed closing.

I bound my Save button to a function in the ViewModel, there I wish to perform an actual save and only then close the UserControl. I've tried several things but I can't get it to work.

Here's my code:

The CloseWindow Command:

public static readonly ICommand CloseWindow = new RelayCommand(currentCommand => ((Window)currentCommand).Close());

The code in my xaml:

        <Button x:Name="Cancel" Height="25" Width="60" HorizontalAlignment="Center" VerticalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" 
                FontFamily="Times New Roman" Foreground="DarkRed" FontWeight="Bold" Content="Cancel" Grid.Column="1" Command="{x:Static Auxiliary_Resources:CommonCommands.CloseWindow}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
        <Button x:Name="Ok" Height="25" Width="60" HorizontalAlignment="Center" VerticalAlignment="Center" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" 
                FontFamily="Times New Roman" Foreground="DarkRed" FontWeight="Bold" Content="Save" Grid.Column="2" Command="{Binding CreateContactCommand}"/>

The function in the ViewModel:

        private void CreateContact(object parameter)
        {
           if ((!String.IsNullOrEmpty(m_contactToAdd.FirstName)) &&
               (!String.IsNullOrEmpty(m_contactToAdd.LastName)) &&
               (!String.IsNullOrEmpty(m_contactToAdd.BankName)) &&
               (m_contactToAdd.AccountNumber != null & (m_contactToAdd.AccountNumber != 0)))
              {
                    m_contactToAdd = Contact.CreateContact(m_contactToAdd.FirstName, m_contactToAdd.LastName,m_contactToAdd.BankName, m_contactToAdd.AccountNumber);
                    DbHandler.AddContact(m_contactToAdd);
              }

           CommonCommands.CloseWindow.Execute(null);
       }

This of course crashes because I'm sending null instead of the window.

Is there a way of achieving what I'm trying to do?

1

There are 1 answers

0
Mike Eason On BEST ANSWER

Simply send the window as the CommandParameter, as you have already done for your CloseCommand.

CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"

And send it to the Execute method.

CommonCommands.CloseWindow.Execute(parameter);