点击按钮时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 ;
}
}
有人知道为什么我不能绑定到这个命令吗?
谢谢大家的意见....
看起来您正在将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看起来像什么,但我怀疑这可以通过删除Grid
上的DataContext
和ItemsControl
上的Binding Data(或任何你用来显示对象列表的东西)来大大简化。
看看下面的错误,看起来你的DockPanel上的DataContext被绑定到某种类型的列表:
我在输出窗口看到这个- BindingExpression路径错误:在'List ' 1' 'object'上找不到'SaveData'属性
如果DataContext不在顶层,请在Binding中重写Source属性