2011-07-05 109 views
4

我在wpf应用程序中具有以下xaml。我想将按钮绑定到视图模型中的ICommand。出于某种原因,我无法从我的观点看到命令。 这是在用户控制。wpf命令在单击按钮时无法执行的问题

<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

你的RelayCommand实现是什么,它不属于标准的WPF库?我猜测CanExecute返回false。 –

+0

我使用Josh Smith的MVVM教程中的relaycommand实现 - http://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx。第二个参数是CanExecute,所以我总是发送正确的... – czuroski

+0

在调试时你能看到VS输出窗口中的任何绑定错误吗? – svick

回答

10

看起来您正在将网格的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是什么样子,但我怀疑,这是可以由栅格上取下的DataContext和ItemsControl的数据绑定(或任何你正在使用大大简化显示对象列表)。

+0

savedata命令确实位于与网格绑定的相同视图模型中。它不应该能看到它吗? – czuroski

+0

不,按钮的DataContext是ViewModel.Data,而不是ViewModel。所以,你试图绑定到ViewModel.Data.SaveData。 (并从你的错误,它似乎像数据是一个对象的列表)。 – SergioL

+0

所以我必须将按钮的datacontext设置为viewmodel? – czuroski

0

以下错误看着,看起来你对DockPanel中的DataContext绑定到某种列表:

I see this in the output window - BindingExpression path error: 'SaveData' property not found on 'object' ''List`1'

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

+0

我应该将源代码设置为viewmodel的名称吗? – czuroski

+0

我通常在后面的代码中设置DataContext。你如何设置你的View的DataContext? –

+0

如上所示,我将它设置在网格级别视图的xaml中 – czuroski