C# 从其他位置绑定到现有命令会导致数据错误:2
我有一个应用程序,其中一些控件可以“发布”某些键绑定,而这些键绑定又会出现在上下文帮助中,例如按钮发布F5键绑定: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
<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);
}
}
}