2012-09-14 6 views
36

すべての種類の属性を含むビューAttributeViewがあります。押されると、デフォルト値を属性に設定するボタンもあります。私はまた、私が持っているすべてのViewModelsの基本クラスであるViewModelBaseクラスを持っています。 問題は、WPFでコマンドにバインドされたボタンを取得できないようです。ViewModelBaseのコマンドにWPFボタンをバインドするにはどうすればいいですか?

私はこれを試してみたが、それだけで何もしない

<Button Command="{Binding DataInitialization}" Content="{x:Static localProperties:Resources.BtnReinitializeData}"></Button> 

コマンドは次のように(ViewModelBaseに)定義されています

public CommandBase DataInitialization { get; protected set; } 

やアプリケーションの起動aの上に

DataInitialization = new DataInitializationCommand() 

ただし、WPFバインディングは「見つからない」ようです彼はコマンド(ボタンを押しても何もしません)。現在のビューで使用されるViewModelはViewModelBaseから派生しています。それ以外の何かを試すことができます(これは非常に単純な質問かもしれないので、私はWPFにはかなり新しくなっています)?

+0

CommandBaseはICommandから継承していますか?ボタンのDataContextにはDataInitializationコマンドが含まれていますか?バインディングについて出力パネルにメッセージがありますか? –

+0

はい、ICommandを継承します。ボタンのDataContextをチェックするにはどうすればいいですか?私はアウトプットのメッセージについて確信が持てません。 –

+0

viewmodelとxamlに関するより多くのコードを表示すると簡単になります –

答えて

88
<Grid > 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Button Command="{Binding ClickCommand}" Width="100" Height="100" Content="wefwfwef"/> 
</Grid> 

ウィンドウの背後にあるコード:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ViewModelBase(); 
    } 
} 

とのViewModel:

public class ViewModelBase 
{ 
    public ViewModelBase() 
    { 
     _canExecute = true; 
    } 
    private ICommand _clickCommand; 
    public ICommand ClickCommand 
    { 
     get 
     { 
      return _clickCommand ?? (_clickCommand = new CommandHandler(() => MyAction(), _canExecute)); 
     } 
    } 
    private bool _canExecute; 
    public void MyAction() 
    { 

    } 
} 
public class CommandHandler : ICommand 
{ 
    private Action _action; 
    private bool _canExecute; 
    public CommandHandler(Action action, bool canExecute) 
    { 
     _action = action; 
     _canExecute = canExecute; 
    } 

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

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     _action(); 
    } 
} 

私はこれがあなたのアイデアを与えることを願っています。

+0

これは私に検索の手がかりを与えました。コマンドが複数の場所で初期化され、これらの場所(正しいもの)の1つがコメントアウトされていることが判明しました:)ありがとう! –

+0

@ kor_:だから我々はもっとコードを尋ねた –

+6

はいこれは私が多くの検索の後に見つけた最良の説明です。ありがとう@Ethicallogics –

関連する問題