C# 单击按钮时wpf命令未执行的问题

C# 单击按钮时wpf命令未执行的问题,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我在WPF应用程序中有以下XAML。我想将按钮绑定到视图模型中的ICommand。由于某些原因,我无法从视图中看到命令。 这在用户控件中 <Grid> <Grid.DataContext> <Binding x:Name="SettingsData" Path="Data" /> </Grid.DataContext> . . . <DockPanel Grid.Col

我在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>
有人知道我为什么不能绑定到这个命令吗


感谢您的想法……

查看以下错误,DockPanel上的DataContext似乎绑定到某种列表:


我在输出窗口中看到了这一点-BindingExpression路径错误: 在“对象”列表“1”上找不到“SaveData”属性


如果DataContext不在顶层,请在绑定中重写源属性

看起来您正在将
网格
DataContext
设置为ViewModel(或对象)的
数据
属性。如果数据属性公开的对象没有提供
SaveData
命令,那么您将遇到所描述的问题。请记住,
DataContext
是从父级继承的

如果您要求以这种方式设置
DataContext
,并且仍然需要按钮引用父级
DataContext
,一个选项是使用相对资源来指向将ViewModel作为
DataContext
的元素

在WPF中,您还可以选择将这些命令设置为静态,并使用
{x:static}
标记扩展来访问它

希望有帮助

编辑:下面是一个示例,如果您的
包含在



另外,我不知道您的完整XAML是什么样子,但我怀疑可以通过删除
网格上的
DataContext
ItemsControl
上的绑定数据(或用于显示对象列表的任何内容)来大大简化这一过程,它不属于标准WPF库?我猜CanExecute返回false。我正在使用Josh Smith的MVVM教程中的relaycommand实现-。第二个参数是CanExecute,所以我总是发送true…在调试时,您能在VS输出窗口中看到任何绑定错误吗?我在输出窗口-BindingExpression路径错误中看到这一点:“对象”列表“1”中未找到“SaveData”属性。您是否已使用
PresentationTraceSources.TraceLevel=High
调试绑定,以查看所有内容是否一致工作?我应该将源设置为viewmodel的名称吗?我通常在代码隐藏中设置DataContext。如何设置视图的DataContext?我在视图的xaml中设置了它,如上图所示。savedata命令确实位于网格绑定到的同一个viewmodel中。难道它不能看到它吗?不,按钮的DataContext是ViewModel.Data,而不是ViewModel。因此,您正在尝试绑定到ViewModel.Data.SaveData。(从您的错误来看,数据似乎是某个对象的列表)。因此,我必须将按钮的datacontext设置为viewmodel吗?是的。但是有一些方法可以在不显式设置Xaml或代码的情况下获取它,包括使用RelativeSource或ElementName指向已经将DataContext设置为ViewModel的UIElement(很可能是网格的父元素)。网格的父元素是实际的usercontrol。如果我将elementname设置为该值,仍然会出现错误。
public ICommand SaveData
{
    get
    {
        if (_saveData == null)
        {
            _saveData = new RelayCommand(
                param => this.saveData(),
                param => true
                );
        }
        return _saveData ;
    }
}
<Button Command="{Binding Path=DataContext.SaveData, 
                          RelativeSource={RelativeSource Mode=FindAncestor, 
                                          AncestorType={x:Type UserControl}}}" ... />