点击按钮时WPF命令不执行的问题

本文关键字:执行 问题 命令 WPF 按钮 | 更新日期: 2023-09-27 18:01:27

我在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>

这是我的iccommand对象-

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

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

谢谢大家的意见....

点击按钮时WPF命令不执行的问题

看起来您正在将GridDataContext设置为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看起来像什么,但我怀疑这可以通过删除Grid上的DataContextItemsControl上的Binding Data(或任何你用来显示对象列表的东西)来大大简化。

看看下面的错误,看起来你的DockPanel上的DataContext被绑定到某种类型的列表:

我在输出窗口看到这个- BindingExpression路径错误:在'List ' 1' 'object'上找不到'SaveData'属性

如果DataContext不在顶层,请在Binding中重写Source属性