Это контейнер имен. Шаблоны ItemTemplates будут отображаться элементом управления «позже» в визуальном цикле, поэтому контейнер именования отличается от области, в которой находится элемент UserControl. Следовательно, Screen не является допустимым элементом в области видимости.
Поскольку мы не видим внутреннюю работу вашего пользовательского элемента управления, мое лучшее решение для вас сейчас - это обернуть ваши узлы в отдельные модели представлений и сделать так, чтобы эти модели представлений ссылались на NodeClickedCommand.
public class NodeViewModel : BaseViewModel
{
public Node Node { get; set; }
public ICommand NodeClickedCommand { get; set; }
}
public class ScreenViewModel : BaseViewModel
{
[NotifyPropertyChanged]
public List<NodeViewModel> Nodes { get; set; }
public ICommand NodeClickedCommand { get; set; }
public ScreenViewModel()
{
NodeClickedCommand = new RelayCommand(NodeClicked);
// ....
// Some code that binds Nodes.
// ....
// This code here whatever it does, when it gets the list of
// nodes, wrap them inside a NodeViewModel instead like this
var nvm = new NodeViewModel()
{
NodeClickedCommand = this.NodeClickedCommand,
Node = Node
};
nodes.Add(nvm);
}
private void NodeClicked()
{
MessageBox.Show("This is never shown");
}
}
Тогда ваш XAML будет выглядеть так:
<UserControl x:Class="ScreenView"
x:Name="Screen"
>
<CustomControl Nodes="{Binding Nodes}">
<CustomControl.ItemTemplate>
<DataTemplate>
<Button Command="{Binding NodeClickedCommand}">
<TextBlock>hello</TextBlock>
</Button>
</DataTemplate>
</CustomControl.ItemTemplate>
</CustomControl>
Вы по-прежнему ссылаетесь на ту же ICommand из ScreenViewModel, поэтому вы не создаете несколько экземпляров этой конкретной команды.