J'essaie d'utiliser la liaison Command et CommandParameter avec des boutons dans une application WPF. J'ai exactement ce même code qui fonctionne très bien dans Silverlight, donc je me demande ce que j'ai fait de mal!La liaison WPF CommandParameter ne se met pas à jour
J'ai une zone de liste déroulante 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 code se cache derrière comme suit:
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, lorsque l'élément SelectedItem de la liste modifiable change, la liaison CommandParameter entraîne la réévaluation de la méthode CanExecute pour ma commande avec l'élément actuellement sélectionné et l'état activé par le bouton est mis à jour en conséquence.
Avec WPF, pour une raison quelconque, la méthode CanExecute est appelée uniquement lorsque la liaison est créée lors de l'analyse du code XAML.
Des idées?
cela va réévaluer toutes les commandes pour toutes les propriétés sur l'interface utilisateur qui changent? et aucun moyen de l'utiliser avec les commandes Delegate? N'y a-t-il pas de solution plus simple ou plus pratique pour cela, comme dans Silverlight? – Firo
Ceci est juste le moyen le plus simple - vous contrôlez quand appeler l'événement CanExecuteChanged - ici je l'ai juste mis à mettre à jour chaque fois que le cadre décide qu'il peut avoir mis à jour. – Goblin