Skip to content
This repository was archived by the owner on May 1, 2024. It is now read-only.

Add BaseCommand.ChangeCanExecute() #736

Merged
merged 5 commits into from
Jan 14, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ public void AsyncCommand_NoParameter_CanExecuteFalse_Test()
}

[Fact]
public void AsyncCommand_CanExecuteChanged_Test()
public void AsyncCommand_RaiseCanExecuteChanged_Test()
{
// Arrange
var canCommandExecute = false;
Expand Down Expand Up @@ -130,6 +130,39 @@ public void AsyncCommand_CanExecuteChanged_Test()
void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true;
}

[Fact]
public void AsyncCommand_ChangeCanExecute_Test()
{
// Arrange
var canCommandExecute = false;
var didCanExecuteChangeFire = false;

var command = new AsyncCommand(NoParameterTask, commandCanExecute);
command.CanExecuteChanged += handleCanExecuteChanged;

bool commandCanExecute(object parameter) => canCommandExecute;

Assert.False(command.CanExecute(null));

// Act
canCommandExecute = true;

// Assert
Assert.True(command.CanExecute(null));
Assert.False(didCanExecuteChangeFire);

// Act
#pragma warning disable CS0618 // Type or member is obsolete
command.ChangeCanExecute();
#pragma warning restore CS0618 // Type or member is obsolete

// Assert
Assert.True(didCanExecuteChangeFire);
Assert.True(command.CanExecute(null));

void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true;
}

[Fact]
public async Task AsyncCommand_CanExecuteChanged_AllowsMultipleExecutions_Test()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ public void AsyncValueCommandNoParameter_CanExecuteFalse_Test()
}

[Fact]
public void AsyncValueCommandCanExecuteChanged_Test()
public void AsyncValueCommand_RaiseCanExecuteChanged_Test()
{
// Arrange
var canCommandExecute = false;
Expand Down Expand Up @@ -149,6 +149,39 @@ public void AsyncValueCommandCanExecuteChanged_Test()
void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true;
}

[Fact]
public void AsyncValueCommand_ChangeCanExecute_Test()
{
// Arrange
var canCommandExecute = false;
var didCanExecuteChangeFire = false;

var command = new AsyncValueCommand(NoParameterTask, commandCanExecute);
command.CanExecuteChanged += handleCanExecuteChanged;

bool commandCanExecute(object parameter) => canCommandExecute;

Assert.False(command.CanExecute(null));

// Act
canCommandExecute = true;

// Assert
Assert.True(command.CanExecute(null));
Assert.False(didCanExecuteChangeFire);

// Act
#pragma warning disable CS0618 // Type or member is obsolete
command.ChangeCanExecute();
#pragma warning restore CS0618 // Type or member is obsolete

// Assert
Assert.True(didCanExecuteChangeFire);
Assert.True(command.CanExecute(null));

void handleCanExecuteChanged(object sender, EventArgs e) => didCanExecuteChangeFire = true;
}

[Fact]
public async Task AsyncValueCommand_Parameter_CanExecuteChanged_AllowsMultipleExecutions_Test()
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.ComponentModel;
using Xamarin.CommunityToolkit.Helpers;
using Xamarin.Forms;

Expand Down Expand Up @@ -77,12 +78,18 @@ protected int ExecutionCount
};

/// <summary>
/// Raises the CanExecuteChanged event.
/// Raises the `ICommand.CanExecuteChanged` event.
/// </summary>
public void RaiseCanExecuteChanged()
{
// Automatically marshall to the Main Thread to adhere to the way that Xamarin.Forms automatically marshalls binding events to Main Thread
Device.BeginInvokeOnMainThread(() => weakEventManager.RaiseEvent(this, EventArgs.Empty, nameof(CanExecuteChanged)));
}

/// <summary>
/// Raises the `ICommand.CanExecuteChanged` event. Recommend using RaiseCanExecuteChanged() instead.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ChangeCanExecute() => RaiseCanExecuteChanged();
}
}