C#WPF MVVM Light CanExecute无法识别

时间:2015-09-08 12:38:30

标签: c# wpf xaml mvvm mvvm-light

我正在学习WPF和MVVM并且遇到一些问题。

我正在使用MVVM Light,我希望在验证后禁用/启用一些按钮,但它不使用这些功能。

ViewModelMain:

using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.Entity;

namespace EF_MVVM_Test
{
    public class ViewModelMain : ViewModelBase
    {
        public RelayCommand AddAuthorCommand { get; private set; }
        public RelayCommand DeleteAuthorCommand { get; private set; }
        public RelayCommand RefreshCommand { get; private set; }
        public RelayCommand SaveCommand { get; private set; }

        public ObservableCollection<Author> Authors { get; set; }
        private LibraryContext db;

        private Author _SelectedAuthor;
        public Author SelectedAuthor
        {
            get { return _SelectedAuthor; }
            set { Set("SelectedAuthor", ref _SelectedAuthor, value); }
        }

        private Author _NewAuthor;
        public Author NewAuthor
        {
            get { return _NewAuthor; }
            set { Set("NewAuthor", ref _NewAuthor, value); }
        }

        public ViewModelMain()
        {
            db = new LibraryContext();
            db.Author.Load();
            Authors = db.Author.Local;

            AddAuthorCommand = new RelayCommand(ExecuteAddAuthorCommand, CanExecuteAddAuthorCommand);
            DeleteAuthorCommand = new RelayCommand(ExecuteDeleteAuthorCommand, CanExecuteDeleteAuthorCommand);
            RefreshCommand = new RelayCommand(ExecuteRefreshListCommand);
            SaveCommand = new RelayCommand(ExecuteSaveCommand);

            NewAuthor = new Author();
        }

        private void ExecuteAddAuthorCommand()
        {
            db.Author.Add(_NewAuthor);
            NewAuthor = new Author();
        }
        private void ExecuteDeleteAuthorCommand()
        {
            db.Author.Remove(SelectedAuthor);
        }
        private void ExecuteRefreshListCommand()
        {
            db.Author.Load();
            Authors = db.Author.Local;
        }
        private void ExecuteSaveCommand()
        {
            db.SaveChanges();
        }

        private bool CanExecuteAddAuthorCommand()
        {
            return (!string.IsNullOrEmpty(NewAuthor.Name) && NewAuthor.Birthday != null);
        }
        private bool CanExecuteDeleteAuthorCommand()
        {
            return SelectedAuthor != null;
        }
    }
}

XAML:

<StackPanel>
        <DataGrid ItemsSource="{Binding Authors}" SelectedItem="{Binding SelectedAuthor}" AutoGenerateColumns="False" Height="200" Margin="5" CanUserAddRows="False" CanUserDeleteRows="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Birthday" Binding="{Binding Birthday}"/>
            </DataGrid.Columns>
        </DataGrid>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Name" Margin="5" VerticalAlignment="Center"/>
            <TextBox Height="25" Width="70" Margin="5" Text="{Binding NewAuthor.Name}"/>
            <TextBlock Text="Geburtstag" Margin="5" VerticalAlignment="Center"/>
            <DatePicker Height="25" Width="130" Margin="5" SelectedDate="{Binding NewAuthor.Birthday}"/>
            <Button Margin="5" Height="25" Width="80" Content="Hinzufügen" HorizontalAlignment="Left" Command="{Binding AddAuthorCommand}"/>
            <Button Margin="5" Height="25" Width="80" Content="Löschen" HorizontalAlignment="Left" Command="{Binding DeleteAuthorCommand}"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal">
            <Button Width="120" Height="25" Content="Speichern" HorizontalAlignment="Left" Margin="5" Command="{Binding SaveCommand}"/>
            <!--Button Width="120" Height="25" Content="Aktualisieren" HorizontalAlignment="Left" Margin="5" Command="{Binding RefreshCommand}"/-->
        </StackPanel>
</StackPanel>

为什么按钮没有使用canexecute函数的任何想法?

3 个答案:

答案 0 :(得分:2)

您的问题是您正在使用的命名空间:

using GalaSoft.MvvmLight.Command;

将其替换为:

using GalaSoft.MvvmLight.CommandWpf;

答案 1 :(得分:0)

WPF的CommandManager在检测到UI更改时调用CanExecute?什么构成UI变化?添加和删​​除元素,一些绑定更新,可视状态更改。基本上,只要WPF感觉像它。这是不可靠的。

你怎么穿这个?如果您需要刷新RelayCommand,请致电RelayCommand.RaiseCanExecuteChanged()。此方法引发一个事件,通知WPF它应该重新评估命令的状态。

答案 2 :(得分:0)

看起来你几天前和我有同样的问题。

ICommand doesn't work

ICommand.CanExecute没有打电话,因为您当然不会说按钮:&#34;当我在TextBox&#中插入内容时,按钮点击的功能可能会发生变化34 ;.因此,如果文本框文本发生变化,您的按钮不会意识到他可以启用。您必须明确告诉该按钮,当文本发生更改时,应通过在textbox tex更改时引发ICommand.CanExecute事件来检查ICommand.CanExecuteChanged