Skip to content

Commit 93796f8

Browse files
committed
Preventing debug asserts when using debug builds of WPF
1 parent a4758eb commit 93796f8

File tree

1 file changed

+39
-2
lines changed

1 file changed

+39
-2
lines changed

Fluent.Ribbon/Converters/ObjectToImageConverter.cs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,36 @@ private object CreateMultiBinding(IServiceProvider serviceProvider)
246246
multiBinding.Bindings.Add(this.TargetVisualBinding);
247247
}
248248

249-
return multiBinding.ProvideValue(serviceProvider);
249+
return multiBinding.ProvideValue(new ServiceProviderWrapper(serviceProvider));
250+
}
251+
252+
private class ServiceProviderWrapper : IServiceProvider, IProvideValueTarget
253+
{
254+
private readonly IServiceProvider serviceProvider;
255+
256+
public ServiceProviderWrapper(IServiceProvider serviceProvider)
257+
{
258+
this.serviceProvider = serviceProvider;
259+
}
260+
261+
/// <inheritdoc />
262+
public object? GetService(Type serviceType)
263+
{
264+
if (serviceType == typeof(IProvideValueTarget))
265+
{
266+
return this;
267+
}
268+
269+
return this.serviceProvider.GetService(serviceType);
270+
}
271+
272+
/// <inheritdoc />
273+
public object? TargetObject => ((IProvideValueTarget)this.serviceProvider).TargetObject is DependencyObject dpo
274+
? dpo
275+
: null;
276+
277+
/// <inheritdoc />
278+
public object TargetProperty => ((IProvideValueTarget)this.serviceProvider).TargetProperty;
250279
}
251280

252281
private object? Convert(object? value, Visual? targetVisual, Size desiredSize, Type targetType)
@@ -366,9 +395,17 @@ private object CreateMultiBinding(IServiceProvider serviceProvider)
366395
{
367396
var type = expression.GetType();
368397
var method = type.GetMethod("GetValue", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
398+
var field = type.GetField("_targetObject", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
369399

370-
if (method is not null)
400+
if (method is not null
401+
&& field is not null)
371402
{
403+
// We have to set the target object. otherwise we might hit debug asserts.
404+
if (field.GetValue(expression) is null)
405+
{
406+
field.SetValue(expression, targetVisual);
407+
}
408+
372409
var valueFromExpression = method.Invoke(expression, new object[]
373410
{
374411
targetVisual,

0 commit comments

Comments
 (0)