在這裏,我使用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解釋它的作用是什麼,如果你需要整個班級代碼比我會給它。
這是什麼解析** ParserContext parserContext ** .explain簡言之 – prjndhi
@prjndhi:與它無關。 –