2012-06-16 38 views
5

OK, tôi có xu hướng tránh sử dụng lệnh bởi vì họ luôn cố gắng gây nhầm lẫn với tôi, nhưng tôi đang trong một dự án mới và đang cố gắng kiến ​​trúc nó một cách chính xác mà không có mã phía sau lượt xem. Về cơ bản tất cả những gì tôi đang cố gắng làm ngay bây giờ là dây lên một nút kích hoạt một lệnh thực hiện một số điều trên mô hình khung nhìn của tôi, và bằng cách nào đó một cái gì đó đơn giản như vậy vẫn gây rắc rối cho tôi. Tôi nghĩ tôi gần nhưng không thể đến đó được. Đây là những gì tôi có ngay bây giờ.Lệnh gọi phương thức từ viewmodel

<Window.Resources> 
    <RoutedUICommand x:Key="GetMusic" /> 
</Window.Resources> 
<Window.DataContext> 
    <core:ViewMain /> 
</Window.DataContext> 
<Window.CommandBindings> 
    <CommandBinding Command="{StaticResource GetMusic}" Executed="GetMusicExecuted"/> 
</Window.CommandBindings> 

Và mô hình xem là khá nhiều không có gì ngay bây giờ

public class ViewMain 
{ 
    public MusicCollection Music { get; set; } 

    private void GetMusicExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     //Logic 
    } 
} 

Bây giờ những gì tôi đang cố gắng làm là dây lên lệnh này tôi thiết lập trong bindings lệnh của tôi để chỉ cần gọi phương pháp thực hiện của tôi trong mô hình chế độ xem của tôi, tuy nhiên, nó cố gắng tìm phương thức đó trong chính chế độ xem. Có cách nào tôi có thể hướng nó đến phương pháp trong mô hình xem của tôi thay vào đó, hoặc một cách tốt hơn để thiết lập điều này để thực hiện điều tương tự? Hy vọng để giữ nó đơn giản lúc đầu vì vậy tôi không thổi tâm trí của tôi quá sớm.

+0

bạn cần thiết lập các ràng buộc hoặc thông qua XAML hoặc mã phía sau – uowzd01

+0

Bạn đã xem xét sử dụng DelegateCommands trong các khung MVVM chuẩn của bạn như Prism? Tôi nghĩ rằng nó làm cho lệnh dễ dàng hơn nhiều vì lệnh của bạn nằm trong VM và bạn có thể ràng buộc nó mà không cần phải định nghĩa CommandBindings. –

Trả lời

11

Tôi có xu hướng sử dụng lớp lệnh của riêng mình, triển khai ICommand. Sau đó, tôi liên kết thuộc tính Button Command với thuộc tính lệnh trong mô hình khung nhìn của tôi. Khi nút được bấm, nó thực thi phương thức Execute bất cứ thứ gì được liên kết với thuộc tính Command.

Đây là phiên bản hai phút xấu xí, nhưng nó cho thấy cách bạn có thể tạo một lớp Command và sau đó gán cho các đại biểu trỏ lại bất kỳ phương thức nào bạn thích trên mô hình xem của mình.

ViewModel:

public class MyViewModel 
{ 
    public MyCommand ActionCommand 
    { 
     get; 
     set; 
    } 

    public MyViewModel() 
    { 
     ActionCommand = new MyCommand(); 
     ActionCommand.CanExecuteFunc = obj => true; 
     ActionCommand.ExecuteFunc = MyActionFunc; 
    } 

    public void MyActionFunc(object parameter) 
    { 
     // Do stuff here 
    } 

} 

public class MyCommand : ICommand 
{ 
    public Predicate<object> CanExecuteFunc 
    { 
     get; 
     set; 
    } 

    public Action<object> ExecuteFunc 
    { 
     get; 
     set; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return CanExecuteFunc(parameter); 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     ExecuteFunc(parameter); 
    } 
} 

The View sẽ liên kết với nó thusly (giả sử DataContext được thiết lập để một thể hiện của mô hình xem):

<Window x:Class="exp.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Button Command="{Binding Path=ActionCommand}">Action</Button> 
    </Grid> 
</Window> 
+0

Có vẻ tốt, trong trường hợp này bạn đang sử dụng MyCommand làm cơ sở cho mọi lệnh vì bạn có thể gửi một hàm khác để thực hiện cho mỗi lệnh? –

+1

Trong trường hợp thi, có. Sau đó, bạn không phải tạo nhiều lớp lệnh khác nhau nếu tất cả những gì bạn muốn làm là gọi một phương thức hiện có trên mô hình khung nhìn của bạn. Bạn có thể tạo các lệnh khác nhau nếu bạn muốn. – Japple

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