У меня есть приложение, в котором некоторые элементы управления могут «публиковать» определенные привязки клавиш, которые, в свою очередь, отображаются в контекстной справке, например, кнопка публикует 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);
}
}
}
Обратите внимание, что пример кода - «Минимальный воспроизводимый пример», и отображаемые значения и / или сочетания клавиш не имеют особого смысла.