Question

Je suis en train d'utiliser la commande et CommandParameter de liaison avec des boutons dans une application WPF. J'ai ce code exact même fonctionne très bien dans Silverlight alors je me demande ce que je fais mal!

J'ai une boîte combo et un bouton, où le paramètre de commande est lié à la combobox SelectedItem:

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

Le derrière de code est suit comme:

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;

}

Avec mon application Silverlight, comme SelectedItem des changements de combobox, le CommandParameter liant provoque la méthode CanExecute pour ma commande pour être réévaluées avec l'élément sélectionné et le bouton activé l'état est mis à jour en conséquence.

Avec WPF, pour une raison quelconque, la méthode CanExecute est invoquée que lorsque la liaison est créée lorsque le XAML est analysé.

Toutes les idées?

Était-ce utile?

La solution

Vous devez dire que WPF CanExecute peut changer - vous pouvez le faire automatiquement dans votre classe TestCommand comme ceci:

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

WPF alors demander CanExecute chaque fois qu'une propriété change dans la vue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top