Привязка к существующей команде из другого места приводит к ошибке данных: 2 - PullRequest
1 голос
/ 10 июня 2019

У меня есть приложение, в котором некоторые элементы управления могут «публиковать» определенные привязки клавиш, которые, в свою очередь, отображаются в контекстной справке, например, кнопка публикует F5 привязку клавиш:

<Button Name="PublishKeybinding" Content="Publish my keybindings!">
    <Button.InputBindings>
         <KeyBinding Command="{Binding TestCommand}" Gesture="F5" />
    </Button.InputBindings>
</Button>

И тамявляется контекстной справкой, показывающей все опубликованные команды в виде интерактивного списка:

<ListView Name="PublicKeybindingsList" ItemsSource="{Binding}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Gesture}">
                <TextBlock.InputBindings>
                    <MouseBinding Command="{Binding Command}" Gesture="LeftClick"/>
                </TextBlock.InputBindings>
            </TextBlock>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

оба (опубликованные и контекстные) экземпляры команды работают и выполняются правильно, однако при привязке регистрируется ошибка привязки, когда PublicKeybindingsList привязка элемента оценивается:

System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента.BindingExpression: Path = TestCommand;DataItem = 'TestVM' (HashCode = 47530006);целевым элементом является KeyBinding (HashCode = 53182860);Свойство target - «Command» (тип «ICommand»)

Как я могу «исправить» ошибку привязки?


Для полноты кода, используемого для воспроизведения проблемы:

public class SomeCommand : ICommand
{
    public event EventHandler CanExecuteChanged;

    public bool CanExecute(object parameter) => true;

    public void Execute(object parameter)
    {
        MessageBox.Show("Success!");
    }
}

public class TestVM
{
    public ICommand TestCommand { get; } = new SomeCommand();
}

public partial class MainWindow : Window
{
    public ObservableCollection<KeyBinding> AllCommands { get; } = new ObservableCollection<KeyBinding>();

    public MainWindow()
    {
        InitializeComponent();
        PublishKeybinding.DataContext = new TestVM();
        PublicKeybindingsList.DataContext = AllCommands;
        foreach (var cmd in PublishKeybinding.InputBindings.OfType<KeyBinding>())
        {
            AllCommands.Add(cmd);
        }
    }
}

Обратите внимание, что пример кода - «Минимальный воспроизводимый пример», и отображаемые значения и / или сочетания клавиш не имеют особого смысла.

...