命令绑定 WPF

本文关键字:WPF 绑定 命令 | 更新日期: 2023-09-27 18:32:37

在我的简单应用程序中,我使用的是CommandCommandBinding。我的问题是,当我像这样在我的主窗口中声明Command时:

<RibbonWindow x:Class="BooksDemo.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:BooksDemo"
    mc:Ignorable="d"
    Title="MainWindow" Height="400" Width="600">
<Window.CommandBindings>
    <CommandBinding Command="Close" Executed="OnClose" />
    <CommandBinding Command="local:BooksCommands.ShowBooksList" />
</Window.CommandBindings> 
<Ribbon DockPanel.Dock="Top">
    <Ribbon.QuickAccessToolBar>
        <RibbonQuickAccessToolBar>
            <RibbonButton SmallImageSource="Images/one.png"
                          Command="local:BooksCommands.ShowBook"/>
            <RibbonButton SmallImageSource="Images/list.png" 
                          Command="local:BooksCommands.ShowBooksList"/>
        </RibbonQuickAccessToolBar>
    </Ribbon.QuickAccessToolBar>
    <Ribbon.ApplicationMenu>
        <RibbonApplicationMenu SmallImageSource="Images/books.png" >
            <RibbonApplicationMenuItem Header="Show _Book" />
            <RibbonSeparator />
            <RibbonApplicationMenuItem Header="Exit" Command="Close" />
        </RibbonApplicationMenu>
    </Ribbon.ApplicationMenu>
    <RibbonTab Header="Home">
        <RibbonGroup Header="Clipboard">
            <RibbonButton Command="Paste" Label="Paste"
                LargeImageSource="Images/paste.png" />
            <RibbonButton Command="Cut" SmallImageSource="Images/cut.png" />
            <RibbonButton Command="Copy" SmallImageSource="Images/copy.png" />
            <RibbonButton Command="Undo" LargeImageSource="Images/undo.png" />
        </RibbonGroup>
        <RibbonGroup Header="Show">
            <RibbonButton LargeImageSource="Images/one.png" Label="Book" />
            <RibbonButton LargeImageSource="Images/list.png" Label="Book List" />
            <RibbonButton LargeImageSource="Images/grid.png" Label="Book Grid" />
        </RibbonGroup>
    </RibbonTab>
    <RibbonTab Header="Ribbon Controls">
        <RibbonGroup Header="Sample">
            <RibbonButton Label="Button" />
            <RibbonCheckBox Label="Checkbox" />
            <RibbonComboBox Label="Combo1">
                <Label>One</Label>
                <Label>Two</Label>
            </RibbonComboBox>
            <RibbonTextBox>Text Box</RibbonTextBox>
            <RibbonSplitButton Label="Split Button">
                <RibbonMenuItem Header="One" />
                <RibbonMenuItem Header="Two" />
            </RibbonSplitButton>
            <RibbonComboBox Label="Combo2" IsEditable="False">
                <RibbonGallery SelectedValuePath="Content" MaxColumnCount="1"
                SelectedValue="Green">
                    <RibbonGalleryCategory>
                        <RibbonGalleryItem Content="Red" Foreground="Red" />
                        <RibbonGalleryItem Content="Green" Foreground="Green" />
                        <RibbonGalleryItem Content="Blue" Foreground="Blue" />
                    </RibbonGalleryCategory>
                </RibbonGallery>
            </RibbonComboBox>
        </RibbonGroup>
    </RibbonTab>

    <ListBox DockPanel.Dock="Left" Margin="5" MinWidth="120">
        <Hyperlink Click="OnShowBook">Show Book</Hyperlink>
    </ListBox>
    <TabControl Margin="5" x:Name="tabControl1">
    </TabControl>
</Ribbon>

它告诉我命名空间中不存在BooksCommands

在类 BooksCommands 中,我声明了命名空间:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
namespace BooksDemo
{
  class BooksCommands
  {
    private static RoutedUICommand showBook;
    public static ICommand ShowBook
    {
        get
        {
            return showBook ?? (showBook = new RoutedUICommand("Show Book",
            "ShowBook", typeof(BooksCommands)));
        }
    }
    private static RoutedUICommand showBooksList;
    public static ICommand ShowBooksList
    {
        get
        {
            if (showBooksList == null)
            {
               showBooksList = new RoutedUICommand("Show Books","ShowBooks",
               typeof(BooksCommands));
               showBook.InputGestures.Add(new KeyGesture(Key.B,Modifierkeys.
               Alt));
            }
            return showBooksList;
        }
    }
}

这是MainWindow.xaml.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Controls.Ribbon;
namespace BooksDemo{
public partial class MainWindow : RibbonWindow
{
       public MainWindow()
    {
        InitializeComponent();
    }

    private void OnClose(object sender, ExecutedRoutedEventArgs e)
    {
        Application.Current.Shutdown();
    }
}
}

有人可以帮我吗?

命令绑定 WPF

  1. 公开BooksCommands课程。
  2. <CommandBinding Command="local:BooksCommands.ShowBooksList" />替换为<CommandBinding x:Key="CmdShowBooksListKey" Command="{x:Static local:BooksCommands.ShowBooksList}" />

尝试显式声明您的 BooksCommands 类为公共类。

此外,Visual Studio 中的 XAML 有时似乎对查找引用感到困惑,并且会引发错误。有时,这些警告/错误是"假的",如果您尝试运行应用程序而没有尝试成功构建它,这些警告/错误就会消失。我认为这是一个Visual Studio的怪癖,我还没有弄清楚。