2013-05-01 14 views
10

Uczę się MVVM i WPF. Mam plik xaml w moim projekcie, który ma prostą obsługę zdarzeń kliknięcia w kodzie.Komenda powiązania w WPF przy użyciu MVVM

Teraz chcę zrobić to samo w MVVM. Czytałem wiele artykułów, a także czytałem wiele odpowiedzi w sof. Nadal nie można tego zrobić.

Może ktoś prosimy podać prosty przykład, w którym kliknij przycisk wydarzenie odbywa się w MVVM.

Edit

<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"; 
     } 
    } 
} 

Z góry dzięki.

+0

Czy korzystasz z jakiejkolwiek architektury MVVM? Co próbujesz? –

+0

Czy korzystanie z MVVM jest obowiązkowe? Nie znam żadnych ram. Jedyne, co mam, to korzystać z ICommand, ale jak z tego korzystać i jakie zmiany są potrzebne w ViewModel, nie wiem. – Narendra

+2

Nie, ale pomaga DUŻO, polecam MVVM Light http://www.galasoft.ch/mvvm/ –

Odpowiedz

23

Możesz powiązać właściwość Command przycisku z dowolną właściwością, która zwraca ICommand. Prism realizuje piękny wygodny polecenie o nazwie DelegateCommand że jest bardzo łatwy w użyciu (here is a knock-off od IT):

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}" /> 

Przykład CodeProject How to use Commands in WPF ma bardzo podobny przykład z kodem, który można łatwo pracować przez. W poprzednim pytaniu Stack Overflow znajduje się przykład użycia RoutedCommand, które są statycznie powiązane z: How to bind Close command to a button, a How to bind WPF button to a command in ViewModelBase? ma nieco bardziej zaawansowany przykład.

+0

Dzięki @ slugster. Czy DelegateCommand jest klasą zdefiniowaną przez system lub czy muszę ją utworzyć? Sprawdzam linki dostarczone przez ciebie. – Narendra

+0

@Narendra Jest to zdefiniowane w bibliotekach Prism, wystarczy je odnieść lub spojrzeć na link do wersji knock-off. – slugster

+0

Dodałem ostatnie zmiany w pytaniu. Czy możesz powiedzieć, dlaczego nie wywołuje wymaganej funkcji? – Narendra

Powiązane problemy