C# 从其他位置绑定到现有命令会导致数据错误:2

C# 从其他位置绑定到现有命令会导致数据错误:2,c#,wpf,xaml,icommand,C#,Wpf,Xaml,Icommand,我有一个应用程序,其中一些控件可以“发布”某些键绑定,而这些键绑定又会出现在上下文帮助中,例如按钮发布F5键绑定: <Button Name="PublishKeybinding" Content="Publish my keybindings!"> <Button.InputBindings> <KeyBinding Command="{Binding TestCommand}" Gesture="F5" /> </B

我有一个应用程序,其中一些控件可以“发布”某些键绑定,而这些键绑定又会出现在上下文帮助中,例如按钮发布F5键绑定:

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

请注意,代码示例是“最小的、可复制的示例”,显示的值和/或键绑定没有多大意义。

如果它有助于找到解决方案,则这只会在第一次评估绑定时发生,如果整个
KeyBinding
是在代码而不是XAML中定义的,则不会发生。那么这应该不是问题。这些绑定错误是无害的:@mm8感谢您对此事的确认。然而,项目的可维护性受到“请勿修复此错误实例”列表的严重影响。数据错误2通常很有用-通常在错误的上下文中托管上下文敏感控件时发生,因此抑制也不是一个真正的选择。没有办法抑制这个确切的实例,是吗?我不这么认为。您可能需要考虑以编程方式设置绑定。或者干脆忽略警告。如果它有助于找到解决方案,那么这种情况只会在第一次计算绑定时发生,如果整个
KeyBinding
是在代码中而不是在XAML中定义的,则不会发生。那么这不应该是个问题。这些绑定错误是无害的:@mm8感谢您对此事的确认。然而,项目的可维护性受到“请勿修复此错误实例”列表的严重影响。数据错误2通常很有用-通常在错误的上下文中托管上下文敏感控件时发生,因此抑制也不是一个真正的选择。没有办法抑制这个确切的实例,是吗?我不这么认为。您可能需要考虑以编程方式设置绑定。或者干脆无视警告。
<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>
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);
        }
    }
}