在WPF应用程序中未执行ICommand

问题描述 投票:1回答:1

我有一个WPF应用程序,带有一个绑定到MessageCommand的按钮。为了简单起见,该应用程序只有一个按钮,该按钮应显示一个消息框。但是,当我单击按钮时,什么也没有发生。我正在按照CodeProject的说明进行操作,但是尽管有很多关于此主题的问题和答案,但我不知道我缺少什么。

XAML文件:

<Window x:Class="CommandTestProject.MainWindow"
        ...
        xmlns:local="clr-namespace:CommandTestProject"
        xmlns:vw="clr-namespace:CommandTestProject.ViewModel"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <vw:ViewModelMsg/>
    </Window.DataContext>
    <Grid>
        <Button Content="Click"
                Command="{Binding Path=MessageCommand}"/>
    </Grid>
</Window>

ViewModel类:

using CommandTestProject.Commands;
using System;
using System.Windows;
using System.Windows.Input;

namespace CommandTestProject.ViewModel
{
    public class ViewModelMsg
    {
        private ShowMessage showMsg;
        public ViewModelMsg()
        {
            showMsg = new ShowMessage(this);
        }

        internal ICommand MessageCommand
        {
            get
            {
                return showMsg;
            }
        }
        internal void Message()
        {
            MessageBox.Show("This is a test command!");
        }
    }
}

ShowMessage类:

using CommandTestProject.ViewModel;
using System;
using System.Windows.Input;

namespace CommandTestProject.Commands
{
    public class ShowMessage : ICommand
    {
        private ViewModelMsg viewModel;
        public event EventHandler CanExecuteChanged;
        public ShowMessage(ViewModelMsg vm)
        {
            viewModel = vm;
        }

        public bool CanExecute(object parameter)
        {
            return true;
        }

        public void Execute(object parameter)
        {
            viewModel.Message();
        }
    }
}

c# wpf binding icommand
1个回答
0
投票

在您的视图模型中,将internal ICommand MessageCommand更改为public ICommand MessageCommand,它将起作用。绑定到内部属性将不起作用,因为绑定是由位于单独程序集中的绑定引擎(PresentationFramework.dll)解析的。

© www.soinside.com 2019 - 2024. All rights reserved.