2010-06-22 17 views
7

Estoy tratando de utilizar el comando y el enlace CommandParameter con botones en una aplicación WPF. Tengo este mismo código exacto que funciona perfectamente en Silverlight, así que me pregunto qué he hecho mal.WPF CommandParameter no se está actualizando vinculando

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 código subyacente 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, a medida que cambia el elemento seleccionado del cuadro combinado, el enlace CommandParameter hace que el método CanExecute para mi comando vuelva a evaluarse con el elemento seleccionado actualmente y el estado de botón habilitado se actualiza en consecuencia.

Con WPF, por alguna razón, el método CanExecute solo se invoca cuando se crea el enlace cuando se analiza el XAML.

¿Alguna idea?

Respuesta

8

tiene que decirle a WPF que CanExecute puede cambiar - usted puede hacer esto de forma automática en su clase TestCommand así:

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

WPF le pedirá entonces CanExecute cada vez que una propiedad cambia de la vista.

+0

esto reevaluará todos los comandos para todas las propiedades en la interfaz de usuario que cambian? y no hay forma de usarlo con los comandos Delegate? ¿No hay una solución más simple o nueva para esto como en Silverlight? – Firo

+0

Esta es la manera más simple: usted controla cuándo llamar al evento CanExecuteChanged, aquí solo lo configuro para actualizar cada vez que el marco decida que se haya actualizado. – Goblin

Cuestiones relacionadas