Domanda

Sto cercando di usare comandi e CommandParameter vincolante con i pulsanti in un'applicazione WPF. Ho questo esattamente lo stesso codice lavorando bene in Silverlight così mi chiedo che cosa ho fatto di sbagliato!

Ho una casella combinata e un pulsante, in cui il parametro di comando è legato alla SelectedItem combobox:

<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>

Il dietro codice è il seguente:

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;

}

Con la mia applicazione Silverlight, come il SelectedItem dei cambiamenti ComboBox, il legame CommandParameter fa sì che il metodo CanExecute per il mio comando per essere rivalutata con l'elemento attualmente selezionato e il pulsante attivato stato viene aggiornato di conseguenza.

Con WPF, per qualche motivo, il metodo CanExecute viene invocato solo quando viene creata l'associazione quando il XAML viene analizzato.

Tutte le idee?

È stato utile?

Soluzione

Devi dire a WPF che CanExecute può cambiare - si può fare questo automaticamente nella tua classe TestCommand in questo modo:

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

WPF vi chiederà CanExecute ogni volta una proprietà cambia nella vista.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top