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