Frage

Ich versuche, Command and Command Bindung mit Buttons in einer WPF-Anwendung zu verwenden. Ich habe diese exakt gleichen Code einfach gut in Silverlight arbeiten, damit ich frage mich, was ich falsch gemacht haben!

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

<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 hinter sich 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, wie die SelectedItem der Combobox ändert, wird die Command Bindung bewirkt, dass die CanExecute Methode für mein Kommando neu bewertet mit dem aktuell ausgewählten Elemente werden und die Schaltfläche aktivierte Zustand entsprechend aktualisiert wird.

Mit WPF, aus irgendeinem Grunde wird die CanExecute Methode nur aufgerufen, wenn die Bindung erzeugt wird, wenn die XAML analysiert wird.

Irgendwelche Ideen?

War es hilfreich?

Lösung

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

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

WPF wird dann fragen CanExecute jedes Mal eine Eigenschaft ändert in der Ansicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top