2013-05-01 239 views
10

我在學習MVVMWPF。我在我的項目中有一個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框架?你有什麼嘗試? – 2013-05-01 08:25:25

+0

使用MVVM框架是強制性的嗎?我不知道有任何框架。我唯一得到的是我需要使用ICommand,但是如何使用這個以及ViewModel需要哪些更改,我不知道。 – Narendra 2013-05-01 08:28:40

+2

不,但它有助於很多,我建議MVVM光http://www.galasoft.ch/mvvm/ – 2013-05-01 08:30:53

回答

23

您可以將按鈕的Command屬性綁定到任何返回ICommand的屬性。 Prism實現(它here is a knock-off)叫DelegateCommand一個很好的方便的命令,這是非常容易使用:

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有代碼,您可以輕鬆地合作,通過一個非常類似的例子。前面的堆棧溢出問題有一個使用靜態綁定的RoutedCommands的示例:How to bind Close command to a buttonHow to bind WPF button to a command in ViewModelBase?有一個稍微高級的示例。

+0

謝謝@slugster。 DelegateCommand是一個系統定義的類,還是我需要創建它?我正在檢查您提供的鏈接。 – Narendra 2013-05-01 08:34:01

+0

@Narendra它是在Prism庫中定義的,你只需要引用它們,或者查看一下這個knock-off版本的鏈接。 – slugster 2013-05-01 08:41:02

+0

我添加了最近的更改問題。您能否告訴我們爲什麼它沒有調用所需的功能? – Narendra 2013-05-01 09:43:26