2010-06-22 8 views
7

Ich versuche CommandParameter-Bindung mit Schaltflächen in einer WPF-Anwendung zu verwenden. Ich habe genau den gleichen Code, der in Silverlight funktioniert, also frage ich mich, was ich falsch gemacht habe!WPF CommandParameter-Bindung wird nicht aktualisiert

Ich habe ein Kombinationsfeld und eine Schaltfläche, auf dem der Befehl Parameter an die Combobox SelectedItem gebunden ist: hinter

<Window x:Class="WPFCommandBindingProblem.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"> 
    <StackPanel Orientation="Horizontal"> 
     <ComboBox x:Name="combo" VerticalAlignment="Top" /> 
     <Button Content="Do Something" Command="{Binding Path=TestCommand}" 
       CommandParameter="{Binding Path=SelectedItem, ElementName=combo}" 
       VerticalAlignment="Top"/>   
    </StackPanel> 
</Window> 

Der Code ist wie folgt:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     combo.ItemsSource = new List<string>(){ 
      "One", "Two", "Three", "Four", "Five" 
     }; 

     this.DataContext = this; 

    } 

    public TestCommand TestCommand 
    { 
     get 
     { 
      return new TestCommand(); 
     } 
    } 

} 

public class TestCommand : ICommand 
{ 
    public bool CanExecute(object parameter) 
    { 
     return parameter is string && (string)parameter != "Two"; 
    } 

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

    public event EventHandler CanExecuteChanged; 

} 

Mit meiner Silverlight-Anwendung, Wenn sich das SelectedItem der Combobox ändert, bewirkt die CommandParameter-Bindung, dass die CanExecute-Methode für meinen Befehl mit dem aktuell ausgewählten Element erneut ausgewertet wird, und der Status der aktivierten Schaltfläche wird entsprechend aktualisiert.

Mit WPF wird die CanExecute-Methode aus irgendeinem Grund nur aufgerufen, wenn die Bindung erstellt wird, wenn das XAML analysiert wird.

Irgendwelche Ideen?

Antwort

8

Sie müssen WPF sagen, dass CanExecute ändern kann - Sie dies in Ihrer TestCommand Klasse wie folgt automatisch tun können:

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

WPF wird dann CanExecute fragt jedes Mal eine Eigenschaftsänderung in der Ansicht.

+0

Dies überprüft alle Befehle für alle Eigenschaften auf der Benutzeroberfläche, die sich ändern? und keine Möglichkeit, es mit Delegate-Befehlen zu verwenden? Gibt es dafür keine einfachere Lösung wie im Silverlight? – Firo

+0

Dies ist nur der einfachste Weg - Sie steuern, wann das Ereignis CanExecuteChanged aufgerufen wird - hier stelle ich es so ein, dass es aktualisiert wird, sobald das Framework entscheidet, dass es aktualisiert wurde. – Goblin