2012-10-03 78 views
0

我遇到了xaml問題...我創建的按鈕未啓用。這裏是XAML部分:xaml中的禁用按鈕

<Button Margin="0,2,2,2" Width="70" Content="Line" 
     Command="{x:Static local:DrawingCanvas.DrawShape}" 
     CommandTarget="{Binding RelativeSource={RelativeSource Mode=FindAncestor, 
      AncestorType={x:Type Window}}, Path=DrawingTarget}" 
     CommandParameter="Line">   
</Button> 

構造函數之前有云:

public static RoutedCommand DrawShape = new RoutedCommand(); 

在構造函數,我有:

this.CommandBindings.Add(new CommandBinding(DrawingCanvas.DrawShape, DrawShape_Executed, DrawShapeCanExecute)); 

然後,我有:

private void DrawShapeCanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    e.CanExecute = true; **//Isn't this enough to make it enable?** 
    en.Handled = true; 

}

private void DrawShape_Executed(object sender, ExecutedRoutedEventArgs e) 
{ 
    switch (e.Parameter.ToString()) 
    { 
     case "Line": 
      //some code here (incomplete yet) 
      break; 
    } 

當我刪除塊中的第一行(Command="{x:Static ...}")時,它會再次啓用!

+0

所以'Command'你綁定必須返回'CanExecute = FALSE'。你可以發佈顯示'DrawingCanvas.DrawShape'的代碼部分嗎? – McGarnagle

+0

如何定義'DrawingCanvas.DrawShape'? –

+0

** DrawingCanvas **是一個類,在這個類中** DrawShape **被定義爲'public static RoutedCommand DrawShape = new RoutedCommand();' –

回答

2

確保該命令的CanExecute屬性返回true。如果它返回false,它會自動禁用使用該命令的控件。

可以執行應該返回一個布爾,我有點驚訝,不給編譯錯誤。無論如何設法改變它。

private bool DrawShapeCanExecute(object sender, CanExecuteRoutedEventArgs e) 
{ 
    return true; 
} 

編輯:

好,因爲你剛剛發現你想要的是一個簡單的按鈕,在這裏執行命令是一個非常簡單的實現,從我最近的項目之一複製。首先在某個地方定義這個類。

public class GenericCommand : ICommand 
{ 
    public event EventHandler CanExecuteChanged { add{} remove{} } 

    public Predicate<object> CanExecuteFunc{ get; set; } 

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

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

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

下一頁在您的視圖模型中定義的命令和定義這兩個我在通用命令創建的特性(它只是與實現ICommand接口走來基本的東西)。

public GenericCommand MyCommand { get; set; } 

MyCommand = new GenericCommand(); 
MyCommand.CanExecuteFunc = obj => true; 
MyCommand.ExecuteFunc = obj => MyMethod; 

private void MyMethod(object parameter) 
{ 
     //define your command here 
} 

然後只需將按鈕連接到您的命令。

<Button Command="{Binding MyCommand}" /> 

如果這對你來說太過分了(MVVM確實需要一些額外的初始設置)。你可以隨時做到這一點...

<Button Click="MyMethod"/> 

private void MyMethod(object sender, RoutedEventArgs e) 
{ 
    //define your method 
} 
+0

CanExecute在其中有'e.CanExecute = true;',它是CommandBinding()的第三個參數...但它被禁用。 –

+0

@amitkohan從你發佈的內容看來,代碼永遠不會被調用,但是如果沒有發佈更多關於如何設置的東西,很難說。你可以發佈如何定義命令本身(DrawingCanvas.DrawShape) –

+0

這是我所有的1)'聲明DrawShape'作爲路由命令2)bindingcommand 3)設置'DrawShapeCanExecute()'4)最後處理程序是'DrawShape_Executed )'。我在這裏錯過嗎? –