2013-05-01 39 views
10

Tôi đang học MVVMWPF. Tôi có một tập tin xaml trong dự án của tôi và có một trình xử lý sự kiện nhấp chuột đơn giản trong mã phía sau.Lệnh liên kết trong WPF bằng MVVM

Bây giờ tôi muốn làm tương tự trong MVVM. Tôi đã đọc rất nhiều bài báo và cũng đọc nhiều câu trả lời bằng sof. Nhưng vẫn không thể làm điều này.

Bất kỳ ai cũng có thể đưa ra một ví dụ đơn giản trong đó một nút nhấp vào sự kiện được thực hiện trong MVVM.

Sửa

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

Cảm ơn trước.

+0

Bạn có đang sử dụng bất kỳ khung MVVM nào không? Bạn đã thử cái gì? –

+0

Có bắt buộc phải sử dụng khung MVVM không? Tôi không biết về bất kỳ khung công tác nào. Điều duy nhất tôi nhận được là tôi cần phải sử dụng ICommand nhưng làm thế nào để sử dụng điều này và những thay đổi là cần thiết trong ViewModel, tôi không biết. – Narendra

+2

Không, nhưng nó giúp A LOT, tôi muốn giới thiệu MVVM Light http://www.galasoft.ch/mvvm/ –

Trả lời

23

Bạn có thể liên kết thuộc tính Command của nút với bất kỳ thuộc tính nào trả về ICommand. Prism thực hiện một lệnh thoải mái thuận tiện gọi DelegateCommand đó là rất dễ sử dụng (here is a knock-off của nó):

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

Các CodeProject dụ How to use Commands in WPF có một ví dụ rất giống với mã mà bạn có thể dễ dàng làm việc thông qua. Câu hỏi tràn ngăn xếp trước đó có ví dụ sử dụng RoutedCommands được liên kết tĩnh tới: How to bind Close command to a buttonHow to bind WPF button to a command in ViewModelBase? có ví dụ nâng cao hơn một chút.

+0

Thanks @slugster. Là DelegateCommand là một hệ thống được xác định lớp hoặc tôi cần phải tạo ra điều này? Tôi đang kiểm tra các liên kết do bạn cung cấp. – Narendra

+0

@Narendra Nó được định nghĩa trong các thư viện Prism, bạn chỉ cần tham khảo chúng, hoặc nhìn vào liên kết đến phiên bản knock-off. – slugster

+0

Tôi đã thêm các thay đổi gần đây trong câu hỏi. Bạn có thể vui lòng cho biết lý do tại sao nó không gọi chức năng yêu cầu? – Narendra

Các vấn đề liên quan