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

时间:2011-07-05 14:12:49

标签: 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>

这是我的ICommand对象 -

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

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

感谢您的任何想法......

2 个答案:

答案 0 :(得分:12)

看起来您正在将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}}}" ... />

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

答案 1 :(得分:0)

查看下面的错误,看起来你的DockPanel上的DataContext被绑定到某种List:

  

我在输出窗口看到这个--BindingExpression路径错误:   'object'''List`1'

上找不到'SaveData'属性

如果DataContext不在顶层,请覆盖Binding中的Source属性