@@ -158,7 +158,7 @@ public void Visit(ElementNode node, INode parentNode)
158
158
Exception xpe = null ;
159
159
var xKey = node . Properties . ContainsKey ( XmlName . xKey ) ? ( ( ValueNode ) node . Properties [ XmlName . xKey ] ) . Value as string : null ;
160
160
161
- var collection = GetPropertyValue ( source , parentList . XmlName , Context , parentList , out _ , out _ ) as IEnumerable ;
161
+ var collection = GetPropertyValue ( source , parentList . XmlName , Context . RootElement , parentList , out _ , out _ ) as IEnumerable ;
162
162
if ( collection == null )
163
163
xpe = new XamlParseException ( $ "Property { parentList . XmlName . LocalName } is null or is not IEnumerable", node ) ;
164
164
@@ -235,7 +235,7 @@ void ProvideValue(ref object value, ElementNode node, object source, XmlName pro
235
235
serviceProvider = new XamlServiceProvider ( node , Context ) ;
236
236
237
237
if ( serviceProvider != null && propertyName != XmlName . Empty )
238
- ( ( XamlValueTargetProvider ) serviceProvider . IProvideValueTarget ) . TargetProperty = GetTargetProperty ( source , propertyName , Context , node ) ;
238
+ ( ( XamlValueTargetProvider ) serviceProvider . IProvideValueTarget ) . TargetProperty = GetTargetProperty ( source , propertyName , Context . RootElement , node ) ;
239
239
240
240
try {
241
241
if ( markupExtension != null )
@@ -262,15 +262,15 @@ static string GetContentPropertyName(IEnumerable<CustomAttributeData> attributes
262
262
}
263
263
264
264
static bool GetRealNameAndType ( ref Type elementType , string namespaceURI , ref string localname ,
265
- HydrationContext context , IXmlLineInfo lineInfo )
265
+ object rootElement , IXmlLineInfo lineInfo )
266
266
{
267
267
var dotIdx = localname . IndexOf ( '.' ) ;
268
268
if ( dotIdx > 0 ) {
269
269
var typename = localname . Substring ( 0 , dotIdx ) ;
270
270
localname = localname . Substring ( dotIdx + 1 ) ;
271
271
XamlParseException xpe ;
272
272
elementType = XamlParser . GetElementType ( new XmlType ( namespaceURI , typename , null ) , lineInfo ,
273
- context . RootElement . GetType ( ) . GetTypeInfo ( ) . Assembly , out xpe ) ;
273
+ rootElement . GetType ( ) . GetTypeInfo ( ) . Assembly , out xpe ) ;
274
274
275
275
if ( xpe != null )
276
276
throw xpe ;
@@ -304,12 +304,12 @@ static BindableProperty GetBindableProperty(Type elementType, string localName,
304
304
return null ;
305
305
}
306
306
307
- static object GetTargetProperty ( object xamlelement , XmlName propertyName , HydrationContext context , IXmlLineInfo lineInfo )
307
+ static object GetTargetProperty ( object xamlelement , XmlName propertyName , object rootElement , IXmlLineInfo lineInfo )
308
308
{
309
309
var localName = propertyName . LocalName ;
310
310
//If it's an attached BP, update elementType and propertyName
311
311
var bpOwnerType = xamlelement . GetType ( ) ;
312
- GetRealNameAndType ( ref bpOwnerType , propertyName . NamespaceURI , ref localName , context , lineInfo ) ;
312
+ GetRealNameAndType ( ref bpOwnerType , propertyName . NamespaceURI , ref localName , rootElement , lineInfo ) ;
313
313
var property = GetBindableProperty ( bpOwnerType , localName , lineInfo , false ) ;
314
314
315
315
if ( property != null )
@@ -322,64 +322,75 @@ static object GetTargetProperty(object xamlelement, XmlName propertyName, Hydrat
322
322
323
323
public static void SetPropertyValue ( object xamlelement , XmlName propertyName , object value , object rootElement , INode node , HydrationContext context , IXmlLineInfo lineInfo )
324
324
{
325
- var localName = propertyName . LocalName ;
326
325
var serviceProvider = new XamlServiceProvider ( node , context ) ;
327
- Exception xpe = null ;
328
326
var xKey = node is IElementNode && ( ( IElementNode ) node ) . Properties . ContainsKey ( XmlName . xKey ) ? ( ( ValueNode ) ( ( IElementNode ) node ) . Properties [ XmlName . xKey ] ) . Value as string : null ;
329
327
328
+ if ( TrySetPropertyValue ( xamlelement , propertyName , xKey , value , rootElement , lineInfo , serviceProvider , out var xpe ) )
329
+ return ;
330
+
331
+ if ( context . ExceptionHandler != null )
332
+ context . ExceptionHandler ( xpe ) ;
333
+ else
334
+ throw xpe ;
335
+
336
+ }
337
+
338
+ //Used by HotReload, do not change signature
339
+ public static bool TrySetPropertyValue ( object element , XmlName propertyName , string xKey , object value , object rootElement , IXmlLineInfo lineInfo , IServiceProvider serviceProvider , out Exception xpe )
340
+ {
341
+ var localName = propertyName . LocalName ;
342
+ xpe = null ;
343
+
330
344
//If it's an attached BP, update elementType and propertyName
331
- var bpOwnerType = xamlelement . GetType ( ) ;
332
- var attached = GetRealNameAndType ( ref bpOwnerType , propertyName . NamespaceURI , ref localName , context , lineInfo ) ;
345
+ var bpOwnerType = element . GetType ( ) ;
346
+ var attached = GetRealNameAndType ( ref bpOwnerType , propertyName . NamespaceURI , ref localName , rootElement , lineInfo ) ;
333
347
var property = GetBindableProperty ( bpOwnerType , localName , lineInfo , false ) ;
334
348
335
349
//If the target is an event, connect
336
- if ( xpe == null && TryConnectEvent ( xamlelement , localName , attached , value , rootElement , lineInfo , out xpe ) )
337
- return ;
350
+ if ( xpe == null && TryConnectEvent ( element , localName , attached , value , rootElement , lineInfo , out xpe ) )
351
+ return true ;
338
352
339
353
//If Value is DynamicResource and it's a BP, SetDynamicResource
340
- if ( xpe == null && TrySetDynamicResource ( xamlelement , property , value , lineInfo , out xpe ) )
341
- return ;
354
+ if ( xpe == null && TrySetDynamicResource ( element , property , value , lineInfo , out xpe ) )
355
+ return true ;
342
356
343
357
//If value is BindingBase, SetBinding
344
- if ( xpe == null && TrySetBinding ( xamlelement , property , localName , value , lineInfo , out xpe ) )
345
- return ;
358
+ if ( xpe == null && TrySetBinding ( element , property , localName , value , lineInfo , out xpe ) )
359
+ return true ;
346
360
347
361
//If it's a BindableProberty, SetValue
348
- if ( xpe == null && TrySetValue ( xamlelement , property , attached , value , lineInfo , serviceProvider , out xpe ) )
349
- return ;
362
+ if ( xpe == null && TrySetValue ( element , property , attached , value , lineInfo , serviceProvider , out xpe ) )
363
+ return true ;
350
364
351
365
//If we can assign that value to a normal property, let's do it
352
- if ( xpe == null && TrySetProperty ( xamlelement , localName , value , lineInfo , serviceProvider , context , out xpe ) )
353
- return ;
366
+ if ( xpe == null && TrySetProperty ( element , localName , value , lineInfo , serviceProvider , rootElement , out xpe ) )
367
+ return true ;
354
368
355
369
//If it's an already initialized property, add to it
356
- if ( xpe == null && TryAddToProperty ( xamlelement , propertyName , value , xKey , lineInfo , serviceProvider , context , out xpe ) )
357
- return ;
370
+ if ( xpe == null && TryAddToProperty ( element , propertyName , value , xKey , lineInfo , serviceProvider , rootElement , out xpe ) )
371
+ return true ;
358
372
359
373
xpe = xpe ?? new XamlParseException ( $ "Cannot assign property \" { localName } \" : Property does not exist, or is not assignable, or mismatching type between value and property", lineInfo ) ;
360
- if ( context . ExceptionHandler != null )
361
- context . ExceptionHandler ( xpe ) ;
362
- else
363
- throw xpe ;
374
+ return false ;
364
375
}
365
376
366
- public static object GetPropertyValue ( object xamlElement , XmlName propertyName , HydrationContext context , IXmlLineInfo lineInfo , out Exception xpe , out object targetProperty )
377
+ public static object GetPropertyValue ( object xamlElement , XmlName propertyName , object rootElement , IXmlLineInfo lineInfo , out Exception xpe , out object targetProperty )
367
378
{
368
379
var localName = propertyName . LocalName ;
369
380
xpe = null ;
370
381
targetProperty = null ;
371
382
372
383
//If it's an attached BP, update elementType and propertyName
373
384
var bpOwnerType = xamlElement . GetType ( ) ;
374
- var attached = GetRealNameAndType ( ref bpOwnerType , propertyName . NamespaceURI , ref localName , context , lineInfo ) ;
385
+ var attached = GetRealNameAndType ( ref bpOwnerType , propertyName . NamespaceURI , ref localName , rootElement , lineInfo ) ;
375
386
var property = GetBindableProperty ( bpOwnerType , localName , lineInfo , false ) ;
376
387
377
388
//If it's a BindableProberty, GetValue
378
389
if ( xpe == null && TryGetValue ( xamlElement , property , attached , out var value , lineInfo , out xpe , out targetProperty ) )
379
390
return value ;
380
391
381
392
//If it's a normal property, get it
382
- if ( xpe == null && TryGetProperty ( xamlElement , localName , out value , lineInfo , context , out xpe , out targetProperty ) )
393
+ if ( xpe == null && TryGetProperty ( xamlElement , localName , out value , lineInfo , rootElement , out xpe , out targetProperty ) )
383
394
return value ;
384
395
385
396
xpe = xpe ?? new XamlParseException ( $ "Property { localName } is not found or does not have an accessible getter", lineInfo ) ;
@@ -467,19 +478,18 @@ static bool TrySetBinding(object element, BindableProperty property, string loca
467
478
return false ;
468
479
}
469
480
470
- static bool TrySetValue ( object element , BindableProperty property , bool attached , object value , IXmlLineInfo lineInfo , XamlServiceProvider serviceProvider , out Exception exception )
481
+ static bool TrySetValue ( object element , BindableProperty property , bool attached , object value , IXmlLineInfo lineInfo , IServiceProvider serviceProvider , out Exception exception )
471
482
{
472
483
exception = null ;
473
484
474
485
var elementType = element . GetType ( ) ;
475
- var bindable = element as BindableObject ;
476
486
var nativeBindingService = DependencyService . Get < INativeBindingService > ( ) ;
477
487
478
488
if ( property == null )
479
489
return false ;
480
490
481
- if ( serviceProvider != null && serviceProvider . IProvideValueTarget != null )
482
- ( ( XamlValueTargetProvider ) serviceProvider . IProvideValueTarget ) . TargetProperty = property ;
491
+ if ( serviceProvider ? . GetService < IProvideValueTarget > ( ) is XamlValueTargetProvider valueTargetProvider )
492
+ valueTargetProvider . TargetProperty = property ;
483
493
484
494
Func < MemberInfo > minforetriever ;
485
495
if ( attached )
@@ -504,7 +514,7 @@ static bool TrySetValue(object element, BindableProperty property, bool attached
504
514
if ( exception != null )
505
515
return false ;
506
516
507
- if ( bindable != null ) {
517
+ if ( element is BindableObject bindable ) {
508
518
//SetValue doesn't throw on mismatching type, so check before to get a chance to try the property setting or the collection adding
509
519
var nullable = property . ReturnTypeInfo . IsGenericType &&
510
520
property . ReturnTypeInfo . GetGenericTypeDefinition ( ) == typeof ( Nullable < > ) ;
@@ -549,7 +559,7 @@ static bool TryGetValue(object element, BindableProperty property, bool attached
549
559
return true ;
550
560
}
551
561
552
- static bool TrySetProperty ( object element , string localName , object value , IXmlLineInfo lineInfo , XamlServiceProvider serviceProvider , HydrationContext context , out Exception exception )
562
+ static bool TrySetProperty ( object element , string localName , object value , IXmlLineInfo lineInfo , IServiceProvider serviceProvider , object rootElement , out Exception exception )
553
563
{
554
564
exception = null ;
555
565
@@ -559,11 +569,11 @@ static bool TrySetProperty(object element, string localName, object value, IXmlL
559
569
if ( propertyInfo == null || ! propertyInfo . CanWrite || ( setter = propertyInfo . SetMethod ) == null )
560
570
return false ;
561
571
562
- if ( ! IsVisibleFrom ( setter , context . RootElement ) )
572
+ if ( ! IsVisibleFrom ( setter , rootElement ) )
563
573
return false ;
564
574
565
- if ( serviceProvider != null && serviceProvider . IProvideValueTarget != null )
566
- ( ( XamlValueTargetProvider ) serviceProvider . IProvideValueTarget ) . TargetProperty = propertyInfo ;
575
+ if ( serviceProvider ? . GetService < IProvideValueTarget > ( ) is XamlValueTargetProvider valueTargetProvider )
576
+ valueTargetProvider . TargetProperty = propertyInfo ;
567
577
568
578
object convertedValue = value . ConvertTo ( propertyInfo . PropertyType , ( ) => propertyInfo , serviceProvider , out exception ) ;
569
579
if ( exception != null || ( convertedValue != null && ! propertyInfo . PropertyType . IsInstanceOfType ( convertedValue ) ) )
@@ -579,7 +589,7 @@ static bool TrySetProperty(object element, string localName, object value, IXmlL
579
589
}
580
590
}
581
591
582
- static bool TryGetProperty ( object element , string localName , out object value , IXmlLineInfo lineInfo , HydrationContext context , out Exception exception , out object targetProperty )
592
+ static bool TryGetProperty ( object element , string localName , out object value , IXmlLineInfo lineInfo , object rootElement , out Exception exception , out object targetProperty )
583
593
{
584
594
exception = null ;
585
595
value = null ;
@@ -610,7 +620,7 @@ static bool TryGetProperty(object element, string localName, out object value, I
610
620
if ( propertyInfo == null || ! propertyInfo . CanRead || ( getter = propertyInfo . GetMethod ) == null )
611
621
return false ;
612
622
613
- if ( ! IsVisibleFrom ( getter , context . RootElement ) )
623
+ if ( ! IsVisibleFrom ( getter , rootElement ) )
614
624
return false ;
615
625
616
626
value = getter . Invoke ( element , new object [ ] { } ) ;
@@ -630,10 +640,10 @@ static bool IsVisibleFrom(MethodInfo method, object rootElement)
630
640
return false ;
631
641
}
632
642
633
- static bool TryAddToProperty ( object element , XmlName propertyName , object value , string xKey , IXmlLineInfo lineInfo , XamlServiceProvider serviceProvider , HydrationContext context , out Exception exception )
643
+ static bool TryAddToProperty ( object element , XmlName propertyName , object value , string xKey , IXmlLineInfo lineInfo , IServiceProvider serviceProvider , object rootElement , out Exception exception )
634
644
{
635
645
exception = null ;
636
- if ( ! ( GetPropertyValue ( element , propertyName , context , lineInfo , out _ , out var targetProperty ) is IEnumerable collection ) )
646
+ if ( ! ( GetPropertyValue ( element , propertyName , rootElement , lineInfo , out _ , out var targetProperty ) is IEnumerable collection ) )
637
647
return false ;
638
648
639
649
if ( exception == null && TryAddToResourceDictionary ( collection as ResourceDictionary , value , xKey , lineInfo , out exception ) )
@@ -646,8 +656,8 @@ static bool TryAddToProperty(object element, XmlName propertyName, object value,
646
656
if ( addMethod == null )
647
657
return false ;
648
658
649
- if ( serviceProvider != null )
650
- ( ( XamlValueTargetProvider ) serviceProvider . IProvideValueTarget ) . TargetProperty = targetProperty ;
659
+ if ( serviceProvider ? . GetService < IProvideValueTarget > ( ) is XamlValueTargetProvider valueTargetProvider )
660
+ valueTargetProvider . TargetProperty = targetProperty ;
651
661
652
662
try {
653
663
addMethod . Invoke ( collection , new [ ] { value . ConvertTo ( addMethod . GetParameters ( ) [ 0 ] . ParameterType , ( Func < TypeConverter > ) null , serviceProvider , out exception ) } ) ;
@@ -698,7 +708,7 @@ void SetTemplate(ElementTemplate dt, INode node)
698
708
} ;
699
709
}
700
710
701
- static bool TryAddValue ( BindableObject bindable , BindableProperty property , object value , XamlServiceProvider serviceProvider , out Exception exception )
711
+ static bool TryAddValue ( BindableObject bindable , BindableProperty property , object value , IServiceProvider serviceProvider , out Exception exception )
702
712
{
703
713
exception = null ;
704
714
0 commit comments