# NamedCommand programove

**URL:** <https://forum.dotvvm.com/t/namedcommand-programove/298>\
**Category:** Discussion in Czech\
**Created:** [February 20, 2025, 11:14am UTC](https://forum.dotvvm.com/t/namedcommand-programove/298 "2025-02-20T11:14:27Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![kamm85](https://forum.dotvvm.com/user_avatar/forum.dotvvm.com/kamm85/32/18_2.png) [@kamm85](https://forum.dotvvm.com/u/kamm85)\
**Post date:** [February 20, 2025, 11:14am UTC](https://forum.dotvvm.com/t/namedcommand-programove/298/1 "2025-02-20T11:14:27Z")

</div>

Zdravim. Zapasim s vygenerovanim NamedCommand v codeOnly controlce…

DotVVM.Framework.Controls.DotvvmControlException: Internal.ReferencedViewModuleInfoProperty was not set on the NamedCommand.

Delam to blbe? Diky

protected override void OnInit(IDotvvmRequestContext context)  
{  
base.OnInit(context);

```
// Vytvoření NamedCommand a jeho připojení k DropCommand
var dropZoneCommand = new NamedCommand
{
    ID= "DropZoneCommandID",
    Name = "DropZoneCommand",
    Command = GetCommandBinding(DropCommandProperty)
};
dropZoneCommand.Parent = this;

this.Children.Add(dropZoneCommand);

context.ResourceManager.AddRequiredResource("MyControlModule");
...

```

}

protected override void OnLoad(IDotvvmRequestContext context)  
{  
BuildContent(context);

```
base.OnLoad(context);

```

}

private void BuildContent(IDotvvmRequestContext context)  
{  
NamedCommand cmd = this.FindControlInContainer(“DropZoneCommandID”);  
cmd.SetBinding(NamedCommand.CommandProperty, GetCommandBinding(DropCommandProperty));  
…  
}

---

<div class="post-metadata">

**Author:** ![exyi](https://forum.dotvvm.com/user_avatar/forum.dotvvm.com/exyi/32/9_2.png) [@exyi](https://forum.dotvvm.com/u/exyi)\
**Post date:** [February 25, 2025, 10:49pm UTC](https://forum.dotvvm.com/t/namedcommand-programove/298/2 "2025-02-25T22:49:45Z")

</div>

Ta chybová hláška by si celkem zasloužila poupravit… Každopádně používat NamedCommand z code-only controlky víceméně nejde, tam je spíš zamýšlené řešení si napsat knockout binding handler a předat do něj JS funkci. Ostatně NamedCommand dělá přesně tohle with extra steps: [dotvvm/src/Framework/Framework/Controls/NamedCommand.cs at main · riganti/dotvvm · GitHub](https://github.com/riganti/dotvvm/blob/main/src/Framework/Framework/Controls/NamedCommand.cs#L59)

Přidání knockout binding handleru je nějak zdokumentované v [Adding interactivity using Knockout binding handlers | DotVVM Documentation](https://www.dotvvm.com/docs/4.0/pages/concepts/control-development/interactivity), bohužel koukám, že tam není nic o commandech 😕 V podstatě vám stačí něco takového někde v Render fázi (AddAttributesToRender pokud nemáte důvod to dát jinam):

```csharp
var dropCommand = KnockoutHelper.GenerateClientPostbackLambda(
    nameof(DropCommandProperty),
    GetCommandBinding(DropCommandProperty),
    this);

writer.WriteKnockoutDataBindComment(
    "my-custom-binding"
    $"{{ dropCommand: {dropCommand}, nejakaDalsiPropertyTreba: {jsExpressionNecehoDalsiho} }}"
);

```

V JS pak potřebujete něco takového:

```js

ko.bindingHandlers["my-custom-binding"] = {
    init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        const { dropCommand, nejakaDalsiPropertyTreba } = valueAccessor()
        
        
        async function something() {
            await dropCommand(argumentPokudJePotreba)
        }
    },
    // update
}

```

* * *

Hlavní vlastnost `NamedCommand`u je jeho vazba na view module (tzn `@js` direktivu), který je potřeba nějak speciálně inicializovat. Pro normální kontrolky na to nemáme API, protože naše implementace nepodporuje vnořování a code-control můžou obsahovat ITemplate property. Když v kontrolce inicializujete nový view modul, tak by se `NamedCommand` použitý v ITemplate odkazoval na modul té kontrolky místo toho view kde byl definován.
