2012-06-16 34 views
5

好的,我傾向於避免使用命令,因爲他們總是設法混淆我,但我在一個新的項目中,並且試圖在沒有代碼的情況下正確構建它,視圖。基本上我現在想要做的就是連接一個按鈕,它會觸發一個命令,在我的視圖模型上執行一些操作,但不管怎樣,這樣簡單的操作仍然給我帶來麻煩。我想我很接近,但不能完全達到目標。這是我現在所擁有的。從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> 

和視圖模型是非常沒有現在

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

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

現在我想要做的就是電線了這個命令我在命令綁定到他們只是我的可執行的方法建立在我的視圖模型中,但是它試圖在視圖本身內找到該方法。有沒有一種方法可以將它引導至我的視圖模型中的方法,或者更好的方法來設置它以完成同樣的事情?希望一開始就保持簡單,所以我不會太早打擾自己。

+0

需要設置的結合或者通過XAML或代碼背後 – uowzd01

+0

您是否在像Prism這樣的標準MVVM框架中使用DelegateCommands?我認爲這讓命令更容易,因爲你的命令駐留在虛擬機中,你可以綁定它而不必定義CommandBindings。 –

回答

11

我傾向於使用我自己的命令類,實現ICommand。然後我將Button Command屬性綁定到我的視圖模型中的command屬性。當按鈕被點擊時,它執行Execute方法,無論綁定到Command屬性。

這是醜陋的兩分鐘版本,但它顯示瞭如何創建一個Command類,然後將它指派給您的代表,指向您在視圖模型上喜歡的任何方法。

的視圖模型:

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

觀將綁定到它正是如此(假設DataContext設置到視圖模型的一個實例):

<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

看起來不錯,在這種情況下,您是否使用MyCommand作爲每個命令的基礎,因爲您可以發送不同的函數來執行每個命令? –

+1

在這種情況下,是的。然後,如果您只想調用視圖模型上的現有方法,則不必創建大量不同的命令類。如果你願意,你可以創建不同的命令。 – Japple

相關問題