开发者

problem with wpf command not executing when button clicked

I have the following XAML in a WPF application. I would like to bind the button to an ICommand in a view model. For some reason, I am not able to see the command from my view. this is in a user control.

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

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

Here is my ICommand object -

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

Does anyone have any idea why I cannot bind to this command?

Thanks for any thoughts....


Looks like you are setting the DataContext of the Grid to the Data property of your ViewModel (or object). If the object that the Data property exposes doesn't provide the SaveData command, you'll have the problem you're describing. Remember the DataContext is inherited from the parent.

If you require that the DataContext is set in that manner, and still require the button to reference the parent DataContext, one option would be to use a RelativeSource to point to an element that has the ViewModel as the DataContext.

In WPF you also have the option of making those commands static and using the {x:Static} markup extension to reach it.

Hope that helps.

EDIT: Here's an example if your <Grid> is contained in a <UserControl>.

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

Also, I don't know what your full XAML looks like, but I suspect that this can be simplified greatly by removing the DataContext on the Grid and Binding Data on the ItemsControl (or whatever you're using to show the list of objects).


Looking at below error, looks like your DataContext on DockPanel is bound to some sort of List:

I see this in the output window - BindingExpression path error: 'SaveData' property not found on 'object' ''List`1'

Please override Source attribute in Binding if the DataContext is not at the top level

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜