訪問 MarkupExtension.ProvideValue 中的構造函數參數 (Access to a constructor parameter within MarkupExtension.ProvideValue)


問題描述

訪問 MarkupExtension.ProvideValue 中的構造函數參數 (Access to a constructor parameter within MarkupExtension.ProvideValue)

I have MyListYExtension markup extension that has no default constructor. Therefore it can be created with constructor syntax only. Another GetValueExtension markup extension tries to determine the target type of value asked so that it can do necessary conversion. For example, if you assign the value of the second extension to a property of type DoubleGetValueExtension understands it and returns 2.0 instead of "2". Dummy example:

{MyListX Capacity={GetValue ListCapacityParam}}    

Everything goes fine if I assign GetValueExtension to a property. Then the target type is accessible within MarkupExtension.ProvideValue via 

((IProvideValueTarget)serviceProvider).TargetProperty.PropertyType

But when I apply GetValueExtension as a parameter for the constructor of MyListYExtension, then TargetProperty is null:

<!-- no default constructor in MyListY -->
<!-- the first parameter of MyListY is "int capacity" -->
{MyListY {GetValue ListCapacityParam}} 

When XAML parser is assigning values to properties, it performs the default conversion. But it doesn't do it when it takes the value from markup extension. It results in an exception that it cannot assign e.g. string value to double property. To avoid that I try to emulate the default conversion but for that the target type needs to be known.

I cannot find any workaround to determine the actual type of the constructor parameter within MarkupExtension.ProvideValue call.

I can modify GetValueExtension but not MyListYExtension

What can I do to solve this?


參考解法

方法 1:

It looks like a chicken and egg problem. The thing is that constructors can be overloaded and in order to find the suitable constructor, the framework needs to know the type of the parameter you are trying to pass into it. 

In other words, at the time when the ProvideValue is called it is not known what constructor will be used, hence it is not possible to provide the information about the target type.

(by Ivan AkcheurovPavlo Glazkov)

參考文件

  1. Access to a constructor parameter within MarkupExtension.ProvideValue (CC BY-SA 3.0/4.0)

#.net-4.0 #wpf #xaml #C#






相關問題

SendKeys.Send NullReferenceException (SendKeys.Send NullReferenceException)

訪問 MarkupExtension.ProvideValue 中的構造函數參數 (Access to a constructor parameter within MarkupExtension.ProvideValue)

調試時使用 WorkflowInvoker 發生瘋狂的內存洩漏 (Crazy memory leak with WorkflowInvoker while debugging)

為跨域的 .NET Framework 靜默安裝創建部署應用程序? (Creating a deployment application for .NET Framework silent install across domain?)

Windows 窗體關閉後刪除的窗體數據 (Form data erased after Windows form is closed)

如何從 php wordpress 服務器呈現 aspx 頁面 (How to render an aspx page from a php wordpress server)

嘗試通過方法“System.Web.Helpers.Json.Decode(System.String)”訪問字段“System.Web.Helpers.Json._serializer”失敗 (Attempt by method 'System.Web.Helpers.Json.Decode(System.String)' to access field 'System.Web.Helpers.Json._serializer' failed)

如何使用 Windows 資源管理器顯示項目和詳細信息展開/折疊 (How to Display Items and Details with Windows Explorer Expand/Collapse)

在 C# 中通過反射訪問屬性 (Accessing attribute via reflection in C#)

連續輸入時不要引發 TextChanged (Don't raise TextChanged while continuous typing)

MSMQ 異步異常行為 - .NET 4.0 與 .NET 2.0 (MSMQ asynchronous exception behavior - .NET 4.0 vs .NET 2.0)

多線程 WMI 調用 - 如何最好地處理這個? (Multithreading WMI calls - how best to handle this?)







留言討論