我在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 ;
}
}
有没有人知道为什么我不能绑定到这个命令?
感谢您的任何想法......
答案 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属性