单击按钮时wpf命令无法执行的问题

czu*_*ski 7 wpf binding

我在wpf应用程序中有以下xaml.我想将按钮绑定到视图模型中的ICommand.出于某种原因,我无法从我的视图中看到命令.这是在用户控件中.

<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>
Run Code Online (Sandbox Code Playgroud)

这是我的ICommand对象 -

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

有谁知道为什么我不能绑定到这个命令?

谢谢你的任何想法......

Ser*_*ioL 14

看起来您正在将Grid的DataContext设置为ViewModel(或对象)的Data属性.如果Data属性公开的对象不提供SaveData命令,那么您将遇到要描述的问题.请记住,DataContext是从父级继承的.

如果您需要以这种方式设置DataContext,并且仍然需要按钮来引用父DataContext,则一个选项是使用RelativeSource指向具有ViewModel作为DataContext的元素.

在WPF中,您还可以选择使这些命令保持静态,并使用{x:Static}标记扩展来实现它.

希望有所帮助.

编辑:这是一个例子,如果你<Grid>包含在一个<UserControl>.

    <Button Command="{Binding Path=DataContext.SaveData, 
                              RelativeSource={RelativeSource Mode=FindAncestor, 
                                              AncestorType={x:Type UserControl}}}" ... />
Run Code Online (Sandbox Code Playgroud)

另外,我不知道您的完整Xaml是什么样的,但我怀疑通过删除GridControl上的DataContext和ItemsControl上的绑定数据(或者您用来显示对象列表的任何内容),可以大大简化这一点. .