2012-05-18 82 views
0

在這裏,我使用MVVM。在我的合作伙伴使用類CommandBindingExtension,在這我能理解IProvideValueTarget和的IServiceProvider的作用。是什麼IProvideValueTarget和IServiceProvider的區別?

[MarkupExtensionReturnType(typeof(ICommand))] 
public class CommandBindingExtension : MarkupExtension 
{ 
    public CommandBindingExtension(string commandName) 
    { 
     this.CommandName = commandName; 
    } 

    [ConstructorArgument("commandName")] 
    public string CommandName { get; set; } 

    private object targetObject; 
    private object targetProperty; 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     IProvideValueTarget provideValueTarget = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget; 
     if (provideValueTarget != null) 
     { 
      targetObject = provideValueTarget.TargetObject; 
      targetProperty = provideValueTarget.TargetProperty; 
     } 

     if (!string.IsNullOrEmpty(CommandName)) 
     { 
      // The serviceProvider is actually a ProvideValueServiceProvider, which has a private field "_context" of type ParserContext 
      ParserContext parserContext = GetPrivateFieldValue<ParserContext>(serviceProvider, "_context"); 
      if (parserContext != null) 
      { 
       // A ParserContext has a private field "_rootElement", which returns the root element of the XAML file 
       FrameworkElement rootElement = GetPrivateFieldValue<FrameworkElement>(parserContext, "_rootElement"); 
       if (rootElement != null) 
       { 
        // Now we can retrieve the DataContext 
        object dataContext = rootElement.DataContext; 

        // The DataContext may not be set yet when the FrameworkElement is first created, and it may change afterwards, 
        // so we handle the DataContextChanged event to update the Command when needed 
        if (!dataContextChangeHandlerSet) 
        { 
         rootElement.DataContextChanged += new DependencyPropertyChangedEventHandler(rootElement_DataContextChanged); 
         dataContextChangeHandlerSet = true; 
        } 

        if (dataContext != null) 
        { 
         ICommand command = GetCommand(dataContext, CommandName); 
         if (command != null) 
          return command; 
        } 
       } 
      } 
     } 

     // The Command property of an InputBinding cannot be null, so we return a dummy extension instead 
     return DummyCommand.Instance; 
    } 

plz解釋它的作用是什麼,如果你需要整個班級代碼比我會給它。

回答

1

IProvideValueTargetservice provider在這種情況下可以提供的服務之一。有關這些服務的更多信息,請參閱MSDN。支持類型的轉換器和標記擴展用途的類型

作者必須經常有關於其中使用位於標記,或在周圍的對象圖結構的上下文信息。可能需要信息,以便所提供的對象正確實例化,或者使得可以對對象圖中的現有對象進行對象引用。在使用.NET Framework XAML Services時,可能需要的上下文將作爲一系列服務接口公開。

可用於標記擴展或類型的轉換器實現的服務是通過上下文參數是每一個虛擬方法的簽名的一部分連通。在任何情況下,您都可以在上下文中實現IServiceProvider,並且可以調用IServiceProvider.GetService來請求服務。

+0

這是什麼解析** ParserContext parserContext ** .explain簡言之 – prjndhi

+0

@prjndhi:與它無關。 –

相關問題