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");場合、それらを配置できます。RaisePropertyChangedRaiseCanExecuteChanged()

于 2011-07-08T11:53:34.610 に答える