10

コマンドでViewModelに関連付けられたボタンを備えたシンプルなウィンドウがあります。

MyCommand.CanExecute()がfalseの場合、ボタンが無効になると思います。ただし、WPFは、ウィンドウが最初に描画されたときにのみIsEnabledプロパティを設定するようです。以降のアクションは、ボタンの表示状態には影響しません。PrismのDelegateCommandを使用しています。

私の見解:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Button Content="Click Here" Command="{Binding MyCommand}" Width="100" Height="50"/>
</Grid>

と私のViewModel:

public class MyVM : NotificationObject
{
    public MyVM()
    {
        _myCommand = new DelegateCommand(DoStuff, CanDoStuff);
    }

    private void DoStuff()
    {
        Console.WriteLine("Command Executed");
        _myCommand.RaiseCanExecuteChanged();
    }

    private bool CanDoStuff()
    {
        var result =  DateTime.Now.Second % 2 == 0;
        Console.WriteLine("CanExecute is {0}", result);
        return result;
    }

    private DelegateCommand _myCommand;

    public ICommand MyCommand
    {
        get
        {
            return _myCommand;
        }
    }
}

50%の確率で、アプリケーションが読み込まれると、ボタンは適切に無効になります。ただし、ウィンドウの読み込み時に有効になっていて、ボタンをクリックしてコマンドを実行すると、ボタンが無効になる時間の50%が期待できますが、無効になることはありません。コマンドは実行されませんが、ボタンをクリックすることはできます。CanExecute()がfalseの場合にボタンを無効にする必要があることをWPFに理解させるにはどうすればよいですか?

4

2 に答える 2

0

これを試すことができます(Microsoft.Practices.Prism.dll必要です)

public class ViewModel
{
    public DelegateCommand ExportCommand { get; }

    public ViewModel()
    {
        ExportCommand = new DelegateCommand(Export, CanDoExptor);
    }

    private void Export()
    {
        //logic
    }

    private bool _isCanDoExportChecked;

    public bool IsCanDoExportChecked
    {
        get { return _isCanDoExportChecked; }
        set
        {
            if (_isCanDoExportChecked == value) return;

            _isCanDoExportChecked = value;
            ExportCommand.RaiseCanExecuteChanged();
        }
    }

    private bool CanDoExptor()
    {
        return IsCanDoExportChecked;
    }
}
于 2016-05-04T16:28:33.373 に答える