【问题标题】:WPF: Command hindering button to enableWPF:命令阻碍按钮启用
【发布时间】:2018-01-04 09:58:24
【问题描述】:

我有 2 个按钮.. 一开始,其中一个已启用,另一个未启用。然后我对这些按钮有 2 个命令,我需要为它们实现键绑定。这些命令也应该替换按钮的点击方法。

当第一个按钮被点击时,第二个按钮应该被启用。但它不起作用。如果我删除第二个按钮的命令并添加一个点击方法,它会起作用..

xaml:

<Window x:Class="WpfApplication1.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:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <RoutedUICommand x:Key="first" />
        <RoutedUICommand x:Key="second" />
    </Window.Resources>
    <Window.CommandBindings>
        <CommandBinding Command="{StaticResource first}" Executed="CommandBinding_Executed_1" />
        <CommandBinding Command="{StaticResource second}" CanExecute="CommandBinding_CanExecute" Executed="CommandBinding_Executed" />
    </Window.CommandBindings>
    <Window.InputBindings>
        <KeyBinding Key="F4" Command="{StaticResource first}" />
        <KeyBinding Key="F5" Command="{StaticResource second}" />
    </Window.InputBindings>
    <Grid>
        <Button Command="{StaticResource first}" x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="154,146,0,0" VerticalAlignment="Top" Width="75"/>
        <Button Command="{StaticResource second}" IsEnabled="False" x:Name="button1" Content="Button" HorizontalAlignment="Left" Margin="312,146,0,0" VerticalAlignment="Top" Width="75"/>
    </Grid>
</Window>

xaml.cs

using System.Windows;
    using System.Windows.Input;

    namespace WpfApplication1 {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window {
            public MainWindow() {
                InitializeComponent();
            }

            private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e) {
                MessageBox.Show("Test");
            }

            private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
                e.CanExecute = button1.IsEnabled;
            }

            private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e) {
                button1.IsEnabled = true;
            }
        }
    }

【问题讨论】:

    标签: c# wpf xaml command


    【解决方案1】:

    定义CanExecute时,按钮根据e.CanExecute的值启用或禁用,因此显式设置IsEnabled无效,因为它是隐式设置的。

    您可以引入一个由 CommandBinding_CanExecute 返回的变量 - 据我所知,这将产生预期的效果。

    public partial class MainWindow : Window {
    
        // other details elided
    
        bool _enableButton1 = false;
    
        private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e) {
            e.CanExecute = _enableButton1;
        }
    
        private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e) {
            enableButton1 = true;
        }
    }
    

    无论如何,您可以完全省略 CanExecute-action 并明确设置 IsEnabled。这也可以解决问题。

    public partial class MainWindow : Window {
    
        // elided
    
        private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e) {
            button1.IsEnabled = true;
        }
    }
    

    【讨论】:

    • 我不能省略 CanExecute 并依赖按钮的 IsEnabled 属性,因为这样命令可以通过快捷键执行。但你是对的.. 我可以添加一个变量并将按钮的 IsEnabled 属性绑定到它。
    • 好吧,我明白了。很高兴我能帮上忙。请让我知道它是否适合您;)
    【解决方案2】:

    为什么是 Button.IsEnabledDoesNotWork? 以为是在 XAML 中设置的

    因为 Command 会覆盖 IsEnabled 功能。

      public partial class SampleWindow : Window
        {
            private bool _isButton1Enabled = false;
            public SampleWindow()
            {
                InitializeComponent();
            }
    
            private void CommandBinding_Executed(object sender, ExecutedRoutedEventArgs e)
            {
                MessageBox.Show("Test");
            }
    
            private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
            {
                try
                {
                    e.CanExecute = _isButton1Enabled;
                }
                catch (Exception)
                {
    
                    throw;
                }
            }
    
    
            private void CommandBinding_Executed_1(object sender, ExecutedRoutedEventArgs e)
            {
                _isButton1Enabled = true;
    
            }
        }
    

    【讨论】:

    • 这不正是我写的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多