Pregunta problema con el comando wpf que no se ejecuta cuando se hace clic en el botón


Tengo el siguiente xaml en una aplicación wpf. Me gustaría enlazar el botón a un ICommand en un modelo de vista. Por alguna razón, no puedo ver el comando desde mi vista. Esto está en un control de usuario.

<Grid>
<Grid.DataContext>
        <Binding 
            x:Name="SettingsData"
            Path="Data" />
    </Grid.DataContext>
.
.
.
<DockPanel Grid.Column="1">
            <Button x:Name="SaveButton" 
                    DockPanel.Dock="Top"  
                    Height="25"  
                    HorizontalAlignment="Left" 
                    Margin="70 0 0 0"
                    Command="{Binding Path=SaveData}"

                    >Save Changes</Button>
        </DockPanel>
</Grid>

Aquí está mi objeto ICommand:

public ICommand SaveData
        {
            get
            {
                if (_saveData == null)
                {
                    _saveData = new RelayCommand(
                        param => this.saveData(),
                        param => true
                        );
                }
                return _saveData ;
            }
        }

¿Alguien tiene alguna idea de por qué no puedo atarme a este comando?

Gracias por cualquier pensamiento ...


5
2017-07-05 14:12


origen


Respuestas:


Parece que está configurando DataContext de la cuadrícula en la propiedad Data de su ViewModel (u objeto). Si el objeto que expone la propiedad Data no proporciona el comando SaveData, tendrá el problema que está describiendo. Recuerde que el DataContext se hereda del padre.

Si necesita que el DataContext esté configurado de esa manera, y aún necesita que el botón haga referencia al DataContext principal, una opción sería usar un RelativeSource para apuntar a un elemento que tenga el ViewModel como el DataContext.

En WPF también tiene la opción de hacer que esos comandos sean estáticos y usar la extensión de marcado {x: Static} para alcanzarlo.

Espero que ayude.

EDITAR: Aquí hay un ejemplo si tu <Grid> está contenido en un <UserControl>.

    <Button Command="{Binding Path=DataContext.SaveData, 
                              RelativeSource={RelativeSource Mode=FindAncestor, 
                                              AncestorType={x:Type UserControl}}}" ... />

Además, no sé cómo se ve tu Xaml completo, pero sospecho que esto puede simplificarse enormemente eliminando el DataContext en la cuadrícula y los datos de enlace en el ItemsControl (o lo que sea que estés usando para mostrar la lista de objetos) .


11
2017-07-05 14:46



Mirando el siguiente error, parece que su DataContext en DockPanel está vinculado a algún tipo de lista:

Veo esto en la ventana de salida - Error de ruta de BindingExpression:   La propiedad 'SaveData' no se encuentra en 'objeto' '' Lista`1 '

Por favor anule el atributo Fuente en Enlace si el DataContext no está en el nivel superior


0
2017-07-05 14:30