2

我正在尝试实现 WPF MVVM 应用程序。我是这个平台的初学者。我只需要为我的 SaveCommand 实现一个 CanExecute 方法

这是代码

WPF XML 代码

        <Canvas Height="283" Name="canvas1" Width="321">
            <Label Canvas.Left="6" Canvas.Top="6" Content="First Name" Height="25" Width="91" />
            <Label Canvas.Left="6" Canvas.Top="37" Content="Last Name" Height="25" Width="91" />
            <TextBox Canvas.Left="103" Canvas.Top="10" Height="21"  Width="199" Text="{Binding Path=FirstName, UpdateSourceTrigger=PropertyChanged}"/>
            <TextBox Canvas.Left="103" Canvas.Top="37" Height="21"  Width="199" Text="{Binding Path=LastName, UpdateSourceTrigger=PropertyChanged}"/>
            <Button Canvas.Left="228" Canvas.Top="241" Content="Save" Height="23" Width="74" Command="{Binding SaveCommand}" />
            <TextBlock Canvas.Left="28" Canvas.Top="110" Height="19" Width="259" Text="{Binding Path=FullName}"/>
        </Canvas>

C# ViewModel 代码

    public CustomerViewModel(IEventAggregator eventAggregator, IUnityContainer container, ILoggerFacade logger)
        : base(eventAggregator, container, logger)
    {
        logger.Log("View Model Initialized", Category.Debug, Priority.None);
        InitializeCommands();
    }

    public DelegateCommand<object> SaveCommand { get; set; }

    private string firstName;

    public string FirstName
    {
        get { return firstName; }
        set { 
            firstName = value;
            RaisePropertyChanged("FirstName");
        }
    }

    private string lastName;

    public string LastName
    {
        get { return lastName; }
        set { 
            lastName = value;
            RaisePropertyChanged("LastName");
        }
    }
    private string fullName;

    public string FullName
    {
        get { return fullName; }
        set { 
            fullName = value;
            RaisePropertyChanged("FullName");
        }
    }


    private void InitializeCommands()
    {
        SaveCommand = new DelegateCommand<object>(OnSaveCommand, CanSaveExcute);

    }
    private bool CanSaveExcute(object obj)
    {
        if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName))
            return false;
        return true;
    }

    private void OnSaveCommand(object obj)
    {
        FullName = FirstName + " " + LastName;
    }

没有 canSaveExcute 它可以正常工作。设置 CanSaveExcute 后,该按钮保持禁用状态,并且不会在文本更改时启用。据我所知,这是要走的路。

请告诉我我做错了什么。

谢谢

4

1 回答 1

4

您还应该引发“CanExecuteChanged”事件,否则接收者将不得不永久重新访问您的命令,以确定它是否可以执行。您可以使用此处描述的“RaiseCanExecuteChanged”方法

编辑 如果您不介意开销,您可以在调用属性设置器this.SaveCommand.RaiseCanExecuteChanged()后调用。RaisePropertyChanged("FullName");如果您RaisePropertyChanged的方法是虚拟的,则可以放置RaiseCanExecuteChanged()它们。

于 2011-07-08T11:53:34.610 回答