2012-08-24 58 views
4

我創建了一個按鈕,其commandparameter被設置並且使用實現ICommand接口的類來執行命令。但我的按鈕被禁用。這是爲什麼?我從這裏驗證碼:ICommand is like a chocolate cake即使在提供WPF中的CommandParameter後,按鈕仍未啓用

<Window x:Class="ICommand_Implementation_CSharp.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:ICommand_Implementation_CSharp" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid>  
    <Grid> 
     <Grid.Resources> 
      <local:HelloWorldCommand x:Key="hwc" /> 
     </Grid.Resources> 

     <Button Command="{StaticResource hwc}" CommandParameter="Hello" 
       Height="23" HorizontalAlignment="Left" Margin="212,138,0,0" 
       Name="Button1" VerticalAlignment="Top" Width="75">Button</Button> 
    </Grid> 
</Grid> 

和我的課是

class HelloWorldCommand:ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     return parameter != null; 
    } 

    public event EventHandler CanExecuteChanged; 

    public void Execute(object parameter) 
    { 
     MessageBox.Show(parameter.ToString()); 
    } 
} 

回答

5

那麼,這是非常簡單的實施ICommand

正如@JleruOHeP所說,部分問題可以通過交換CommandCommandParameter的設置者來解決。但這是一種醜陋的方式,因爲每次都必須記住序列。

比較正確的做法是告訴CommandManager重新查詢命令的狀態:

public class HelloWorldCommand : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     return parameter != null; 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 

    public void Execute(object parameter) 
    { 
     MessageBox.Show(parameter.ToString()); 
    } 
} 

現在制定者的順序是無動於衷。
要了解CommandManager的工作原理,您可以閱讀約什史密斯的漂亮文章this

+0

+1我剛剛開始鍵入複雜的解釋,但你更快:) – JleruOHeP

+0

+1但有沒有VB版本? –

+0

@NikhilAgrawal,看看這篇文章:http://waxtadpole.wordpress.com/2009/10/21/wpf-mvvm-in-vb-net-delegating-event-subscriptions-for-routedcommand-or-any-icommand -in-the-viewmodel/ – Dennis

5

最簡單的答案 - 命令和命令參數的開關地方:

<Button CommandParameter="Hello" Command="{StaticResource hwc}" .../> 

但更好的是@Dennis

+0

完美。有效。謝謝 –

0

在我的情況下,這是造成這個問題的CommandParameter類型。我的按鈕被簡單地約束像這樣:

<Button Content="New" Command="{Binding NewCommand}" CommandParameter="False" /> 

底層NewCommandRelayCommand<bool>。不知何故,XAML無法將False翻譯爲布爾。 (請注意,它適用於許多內置類型和屬性;可能有些TypeConverter或其他操作)。

解決方案是簡單地填鴨式XAML關於真正的基礎類型的CommandParameter,像這樣:

<Button Content="New" Command="{Binding NewCommand}"> 
    <Button.CommandParameter> 
     <sys:Boolean> 
      False 
     </sys:Boolean> 
    </Button.CommandParameter> 
</Button> 

你必須在你的XAML文件的頂部導入sys命名空間,就像這樣:

xmlns:sys="clr-namespace:System;assembly=mscorlib" 

希望這可以幫助路上的人。

相關問題