Pregunta

Estoy tratando de utilizar comandos y CommandParameter unión con los botones en una aplicación de WPF. Tengo esta exactamente el mismo código de trabajo muy bien en Silverlight, así que estoy preguntando lo que tengo mal hecho!

Tengo un cuadro combinado y un botón, en el que el parámetro de comando se une a la SelectedItem cuadro combinado:

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

El detrás de código es el siguiente:

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 mi aplicación Silverlight, como el SelectedItem de los cambios combobox, la unión CommandParameter hace que el método CanExecute para mi mandamiento de ser re-evaluado con el elemento actualmente seleccionado y el botón habilitado estado se actualiza en consecuencia.

Con WPF, por alguna razón, el método CanExecute sólo se invoca cuando se crea la unión cuando se analiza el XAML.

¿Alguna idea?

¿Fue útil?

Solución

Es necesario decir que WPF CanExecute puede cambiar - usted puede hacer esto de forma automática en su clase TestCommand como esto:

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

WPF continuación, le pedirá CanExecute cada vez que una propiedad cambia en la vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top