none
如何从后端用C#代码改变路由命令当前可执行状态? RRS feed

  • 问题

  • 大家好:

    我在后台用C#代码直接改变路由命令当前可执行状态为True,然后直接启动该命令,但是始终不指导该怎么办,还请各位专家指点迷津。

    前后端代码如下:

    前端:

    <Window x:Class="CommandCSharpCalled.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:CommandCSharpCalled"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Window.Resources>
            <RoutedCommand x:Key="cmd_register"/>
        </Window.Resources>
        <Grid>
            <!--#region 认证用布局和绑定 -->
            <Grid.CommandBindings>
                <CommandBinding x:Name="cmd_register" 
                                Command="{StaticResource cmd_register}" 
                                CanExecute="Cmd_register_CanExecute" 
                                Executed="Cmd_register_Executed"/>
            </Grid.CommandBindings>
            <Menu Height="24" VerticalAlignment="Top" Margin="0,0,-0.4,0">
                <MenuItem FontSize="14" Header="帮助">
                    <MenuItem Header="注册" Command="{StaticResource cmd_register}"/>
                    <Separator/>
                </MenuItem>
            </Menu>
            <TextBox x:Name="tb_Show" HorizontalAlignment="Left" Height="270" Margin="321,29,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="463"/>
            <Button Content="直接后台更改状态并调用命令" HorizontalAlignment="Left" Margin="34,220,0,0" VerticalAlignment="Top" Width="174" Height="51"/>
            <!--#endregion-->
        </Grid>
    </Window>

    后端C#:

    namespace CommandCSharpCalled
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
    
            #region “注册”页面命令
            private void Cmd_register_CanExecute(object sender, CanExecuteRoutedEventArgs e)
            {
                e.CanExecute = true;
                e.Handled = true;
            }
    
            private void Cmd_register_Executed(object sender, ExecutedRoutedEventArgs e)
            {
                tb_Show.Text = "后端直接更改命令可用状态并调用命令。";
                e.Handled = true;
            }
            #endregion
    
            private void Btn_Click(object sender, RoutedEventArgs e)
            {
                //我想在这里改变命令可用状态
            }
        }
    }


    • 已编辑 wxysy 2021年4月27日 1:10 内容具体化
    2021年4月27日 1:09

全部回复

  •  Hi, @ wxysy

    对于Btn_Click中改变命令可用状态,你可以参考以下代码:

    xaml中的button代码修改为:

    <Button Name="bt" Content="直接后台更改状态并调用命令" HorizontalAlignment="Left" Margin="34,220,0,0"
    VerticalAlignment="Top" Width="174" Height="51" Click="Btn_Click"/>

    并且为Grid添加Name=” grid”.

    后台Btn_Click代码:

    
    
    private void Btn_Click(object sender, RoutedEventArgs e)
       
    {
            
    RoutedCommand routedCommand = new RoutedCommand();
    
               
    this.bt.Command = routedCommand;
    
               
    this.bt.CommandTarget = tb_Show;
    
               
    CommandBinding commandBinding = new CommandBinding();
    
               
    commandBinding.Command = routedCommand;
    
               
    commandBinding.CanExecute += new
    CanExecuteRoutedEventHandler(Cmd_register_CanExecute);
    
               
    commandBinding.Executed += new
    ExecutedRoutedEventHandler(Cmd_register_Executed);
    
               
    this.grid.CommandBindings.Add(commandBinding);
    
    }

    结果如下:



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    <audio controls="controls" style="display:none;"></audio>
    2021年4月27日 6:39
  • 感谢您的答复,这样做目标确实能达到。

    但是您这样做的话,相当于另外新建了一个命令进行操作。

    还想请教,有没有能直接对菜单项现有命令进行操作的方法?

    我直接调用现有命令时,有时候能用,有时候不能用。

    即我直接执行:

    cmd_about.Command.CanExecute(null);

    后来我发觉,凡是不能用的时候,其对应的CanExecute()方法,永远返回值为False,我试遍各种方法都无法改变该方法为False的结果。

    即该方法返回值永远为False:

    cmd_about.Command.CanExecute(null);
    有没有办法能设定该CanExecute()方法的返回值?

    2021年4月27日 7:25
  • Hi, @ wxysy

    我根据自己的理解,在通过设置中间变量Flag去修改e.CanExecute的值,以下是我对你问题中后台代码的修改,如果我理解错你的问题,请指出来。

     

    更新后台代码如下:

    using System.ComponentModel;
    using System.Windows;
    using System.Windows.Input;
    namespace WpfApp2
    {
        public partial class MainWindow : Window, INotifyPropertyChanged
        {
            public MainWindow()
            {
                InitializeComponent();
                Flag = false;
            }
            public event PropertyChangedEventHandler PropertyChanged;
            protected void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                {
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
                }
            }
            private bool flag;
            public bool Flag
            {
                get { return flag;
             }
                set
                {
                    flag = value;
                    OnPropertyChanged("Flag");
                }
            }
            private void Cmd_register_CanExecute(object sender, CanExecuteRoutedEventArgs e)
            {
                e.CanExecute = Flag;
                //e.CanExecute = false;
                e.Handled = true;
            }
            private void Cmd_register_Executed(object sender,ExecutedRoutedEventArgs e)
            {
                tb_Show.Text = "后端直接更改命令可用状态并调用命令。";
                e.Handled = true;
            }
            private void Btn_Click(object sender, RoutedEventArgs e)
            {
                Flag = true;
                bool flagCanExecute = false;
                flagCanExecute = 
                this.cmd_register.Command.CanExecute("");            
                this.cmd_register.Command.Execute("");             
                //btnRegister.Command.Execute("");
            }
        }
    }



    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.


    <audio controls="controls" style="display:none;"></audio>
    <audio controls="controls" style="display:none;"></audio>
    2021年4月28日 7:16
  • 感谢您的耐心解答。

    您的方法,本质上是创建一个依赖属性,然后通过这个依赖属性来决定e.CanExecute的值。

    我将您的方法应用到我自己软件中,依然无法解决问题。

    我通过断点追踪发现,即使Flag属性改为True,e.CanExecute也确实被设定为True,但CanExecute方法的返回值仍然是False。

    可能产生这个问题原因,不在e.CanExecute设定与否。

    2021年4月30日 9:18