Skip to content

Commit a52ad2c

Browse files
committed
Fix WPF command rebinding optimization incorrectly applied when binding to non-default event
1 parent 0a131f1 commit a52ad2c

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/ReactiveUI/Bindings/Command/CommandBinderImplementation.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,9 @@ private static IDisposable BindCommandInternal<
200200
var isInitialBind = true;
201201

202202
// Check for optional platform-specific command rebinding customization
203-
var rebindingCustomizer = AppLocator.Current.GetService<ICreatesCustomizedCommandRebinding>();
203+
var rebindingCustomizer = string.IsNullOrEmpty(toEvent)
204+
? AppLocator.Current.GetService<ICreatesCustomizedCommandRebinding>()
205+
: null;
204206

205207
// Cache boxing of parameter values once to avoid rebuilding the Select pipeline on every rebind.
206208
var boxedParameter = withParameter.Select(static p => (object?)p);

src/tests/ReactiveUI.Wpf.Tests/Wpf/WpfCommandBindingImplementationTests.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -275,20 +275,27 @@ public async Task ViewModelShouldBeGarbageCollectedWhenOverwritten()
275275
}
276276

277277
[Test]
278-
public async Task CommandParameterIsCorrectAfterViewModelReassignment()
278+
public async Task CommandAndParameterRebindToNewViewModelInstance()
279279
{
280280
var vm = new CommandBindingViewModel { Value = 1 };
281281
var view = new CommandBindingView { ViewModel = vm };
282282

283-
var received = 0;
284-
view.ViewModel.Command1 = ReactiveCommand.Create<int, int>(i => received = i);
283+
var received1 = 0;
284+
view.ViewModel.Command1.Subscribe(i => received1 = i);
285285

286286
var binding = new CommandBinderImplementation().BindCommand(vm, view, vm => vm.Command1, v => v.Command1, vm => vm.Value, nameof(CustomClickButton.CustomClick));
287287

288288
view.ViewModel = new CommandBindingViewModel { Value = 2 };
289289

290+
var received2 = 0;
291+
view.ViewModel.Command1.Subscribe(i => received2 = i);
292+
290293
view.Command1.RaiseCustomClick();
291294

292-
await Assert.That(received).IsEqualTo(2);
295+
using (Assert.Multiple())
296+
{
297+
await Assert.That(received1).IsEqualTo(0);
298+
await Assert.That(received2).IsEqualTo(2);
299+
}
293300
}
294301
}

0 commit comments

Comments
 (0)