2013-05-01 16 views
10

MVVMおよびWPFを学習しています。私のプロジェクトにはxamlというファイルがあり、コードの中にシンプルなクリックイベントハンドラがあります。MVVMを使用したWPFでのバインドコマンド

MVVMで同じことをやりたいと思います。私は多くの記事を読んで、ソファでも多くの答えを読んでいます。しかし、まだこれを行うことができません。

ボタンをクリックしてイベントをクリックした簡単な例を教えてください。MVVM

編集

<Window x:Class="WhiteBalance.BaseCalWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:uc="clr-namespace:NumberUpDownControl;assembly=NumberUpDownControl" 
     xmlns:viewn="clr-namespace:WhiteBalance.ViewModels" 
     Title="RefImgSettingWindow" Height="900" Width="1000" ResizeMode="NoResize" 
     BorderThickness="4"> 
    <Window.Resources> 
     <viewn:DashBoardViewModel x:Key="demokey"></viewn:DashBoardViewModel> 
    </Window.Resources> 
    <Grid x:Name="gdParent" DataContext="{StaticResource demokey}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="490" /> 
      <ColumnDefinition Width="488*" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="300" /> 
      <RowDefinition Height="300" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <StackPanel Grid.Row="0" Grid.Column="0"> 
      <Label Content="{Binding Path=NAME,Mode=TwoWay}" Height="28" Name="lblTest" /> 
      <Button Content="Capture" Height="23" Name="btnCapture" Width="75" Command="{Binding Path=SaveCommand}" 
          Canvas.Left="94" Canvas.Top="254" /> 

     </StackPanel> 
    </Grid> 
</Window> 

namespace WhiteBalance.ViewModels 
{ 
    public class DashBoardViewModel: ObservableObject 
    { 
     private string _name = "dsqdasd"; 

     public string NAME 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 

     public ICommand SaveCommand 
     { 
      get; 
      set; 
     } 

     private bool CanExecuteSaveCommand() 
     { 
      return true; // !string.IsNullOrEmpty(LastName); 
     } 

     private void CreateSaveCommand() 
     { 
      SaveCommand = new RelayCommand(SaveExecute, CanExecuteSaveCommand); 
     } 

     public void SaveExecute() 
     { 
      //Person.Save(_newPerson); 
      NAME = "Changed Name"; 
     } 

     public DashBoardViewModel() 
     { 
      //objModel.TestText = "This will change"; 
      NAME = "TestName"; 
     } 
    } 
} 

事前に感謝します。

+0

MVVMフレームワークを使用していますか?何を試しましたか? –

+0

MVVMフレームワークを使用することは必須ですか?私はどのフレームワークも認識していません。私が得た唯一のことは、ICommandを使用する必要があるが、これを使用する方法とViewModelで必要な変更が必要なことです。わかりません。 – Narendra

+2

いいえ、しかしそれは助けて、私はMVVMライトをお勧めしますhttp://www.galasoft.ch/mvvm/ –

答えて

23

ボタンのCommandプロパティをICommandを返す任意のプロパティにバインドできます。

public ICommand MyButtonClickCommand 
{ 
    get { return new DelegateCommand<object>(FuncToCall, FuncToEvaluate); } 
} 

private void FuncToCall(object context) 
{ 
    //this is called when the button is clicked 
} 

private bool FuncToEvaluate(object context) 
{ 
    //this is called to evaluate whether FuncToCall can be called 
    //for example you can return true or false based on some validation logic 
    return true; 
} 



<Button x:Name="myButton" Command="{Binding MyButtonClickCommand}" /> 

CodeProjectの例How to use Commands in WPFは、あなたが簡単に通じ働くことができるコードと非常によく似た例があります。Prismは非常に使いやすいですDelegateCommandと呼ばれる素敵な便利なコマンド(これのhere is a knock-off)を実装しています。以前のStack Overflow質問には、静的にバインドされたRoutedCommandsを使用した例があります:How to bind Close command to a button、およびHow to bind WPF button to a command in ViewModelBase?には少し高度な例があります。

+0

ありがとう@スラブスター。 DelegateCommandはシステム定義クラスですか、これを作成する必要はありますか?私はあなたから提供されたリンクをチェックしています。 – Narendra

+0

@ NarendraこれはPrismライブラリで定義されています。参照するだけで、ノックオフ版へのリンクを参照するだけです。 – slugster

+0

問題の最近の変更を追加しました。それが必要な機能を呼び出さない理由を教えてください。 – Narendra

関連する問題