MVVM

2013-05-01 29 views
10

kullanarak WPF'de Bind komutu MVVM ve WPF'u öğreniyorum. Projemde bir xaml dosyası var ve arkadaki kodda basit bir tıklama olay işleyicisi var.MVVM

Şimdi aynısını MVVM'da yapmak istiyorum. Çok sayıda makale okudum ve sofrada birçok cevap okudum. Ama hala bunu yapamaz.

herkes bir düğme tık olay MVVM yapılır edildiği basit bir örnek verebilir misiniz.

Düzenleme önceden

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

teşekkür ederiz.

+0

Herhangi bir MVVM framework kullanıyor musunuz? Ne denedin? –

+0

MVVM çerçevesinin kullanılması zorunlu mudur? Herhangi bir çerçevenin farkında değilim. Sahip olduğum tek şey ICommand kullanmam gerekiyor ama bunu nasıl kullanacağım ve ViewModel'de hangi değişikliklere ihtiyaç duyulduğunu bilmiyorum. – Narendra

+2

Hayır, ama A LOT yardımcı olur, ben tavsiye ederim MVVM Işık http://www.galasoft.ch/mvvm/ –

cevap

23

Düğmenin Command özelliğini, ICommand döndüren herhangi bir özelliğe bağlayabilirsiniz.

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 örneği How to use Commands in WPF kolayca üzerinden çalışabilir kodu ile çok benzer bir örnek vardır: Prism kullanımı çok kolaydır DelegateCommand adlı güzel kullanışlı komutu (bunun here is a knock-off) uygular. Önceki Yığın Taşması sorusu, statik olarak aşağıdakilere bağımlı olan RoutedCommands kullanarak bir örneğe sahiptir: How to bind Close command to a button ve How to bind WPF button to a command in ViewModelBase? biraz daha gelişmiş bir örnektir.

+0

Teşekkürler @slugster. DelegateCommand sistem tanımlı bir sınıf mıdır yoksa bunu oluşturmam gerekiyor mu? Sizin tarafınızdan sağlanan bağlantıları kontrol ediyorum. – Narendra

+0

@Narendra Prism kütüphanelerinde tanımlanmıştır, sadece referans göstermeniz veya knock-off versiyonuna olan linke bakınız. – slugster

+0

Son değişiklikleri söz konusu ekledim. Lütfen neden gerekli fonksiyonu çağırdığını söyler misiniz? – Narendra