2012-03-11 5 views
0

私は、MVVMを使用して大学向けに初めてのWPFアプリケーションを開発しています。私はこの特定の拘束力を働かせることはできませんが、以前に成功した手順を踏んだことはあります。コマンドバインドが機能しない

私は次のXAMLスニペットを持っている:

<Button Command="{Binding GetTicketsCommand}" Canvas.Left="50" Canvas.Top="202" Content="Refresh List" Height="25" Width="137" /> 

ビューは、次のようなVMを初期化:

public JobListView() 
    { 
     InitializeComponent(); 
     viewModel = new JobListViewModel(this); 
     this.DataContext = viewModel; 
    } 

のviewmodelはボタンがバインドGetTicketsCommandというコマンドがありますが、私がクリックしたときコマンドExecuteまたはCanExecuteメソッドが呼び出されないボタン。私が作成したコマンドは、VMコンストラクタでインスタンス化されています。

アイデア?

編集:

コマンドクラスは、このようなものです:

public class GetTicketsCommand : ICommand 
{ 
    private readonly JobListViewModel viewModel; 

    public GetTicketsCommand(JobListViewModel viewModel) 
    { 
     this.viewModel = viewModel;  
    } 

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

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

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 
} 

とのviewmodelに、私は単純に、コンストラクタでそのインスタンスを作成します。

public JobListViewModel() 
    { 
     GetTicketsCommand = new GetTicketsCommand(this); 
     dataAccess = new DataLayerClient(); 
    } 
+0

私たちはあなたのコマンドを管理し、あなたのビューモデルのコードを見ることができ、あなたのビューモデル内のあなたのGetTicketsCommandコマンドが財産であることを確認してください? – BoltClock

+0

どのMVVMツールキットを使用していますか? –

+1

実行時にVSの出力ウィンドウにバインディングエラーがありますか?あなたのビューモデルはどのように見えますか? – nemesv

答えて

2

バインディングはプロパティでのみ機能します。

public ICommand GetTicketsCommand { get; set; } 

ではなく、フィールド:

public ICommand GetTicketsCommand; 
+0

ありがとうございます。どのような愚かなエラー:)それらの1つはあなたがちょうど顔であなたを見つめて見ることができません。再度、感謝します。 –

1

についてはMVVMのシナリオRelayCommandまたはDelegateCommandは、WPFで提供されるRoutedCommandよりも適しています。

DelegateCommandはPrismフレームワークで提供され、RelayCommand(DelegateCommandに基づく)の実装の詳細についてはhttp://msdn.microsoft.com/en-us/magazine/dd419663.aspxを参照してください。

コマンドには制限があります。たとえば、コマンドが実行できないことを示す場合、ボタンは無効になります。代わりにボタンを非表示にしたい場合はどうすればいいですか?コマンドは、UIを再イメージする際にスコープを制限します。

を実装するCaliburn.Microをご覧ください。これらを使用すると、すべての規則に基づいて、コントロールタイプのデフォルトイベントからビューモデルの動詞を呼び出すことができます。

例として、ビューにSaveという名前のボタンがある場合、ボタンをクリックするとビューモデルのSaveメソッドが呼び出されます。明示的配管は必要ありません。ビューモデルのCanSaveプロパティがfalseを返す場合、ボタンの動作に柔軟性があります。

+0

情報と詳細な読書をありがとう。確かにそれらを見てください。 –

関連する問題