2011-06-23 41 views
0

我需要帮助来弄清为什么我的命令在菜单项上不起作用。我一直在使用Google的解决方案,而且在这里也找不到。但可能是因为我的知识(初学者WPF),我仍然无法解决它。任何帮助表示赞赏!命令不能用于菜​​单项

它适用于按钮,但不适用于菜单项。

XAML:

<Window x:Class="WPFBeginner.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="349" Width="259"> 
    <Grid> 
     <Grid.RowDefinitions /> 
     <Grid.ColumnDefinitions /> 
     <Menu Height="22" HorizontalAlignment="Left" Name="menu1" VerticalAlignment="Top" Width="237" Margin="0,1,0,0"> 
      <MenuItem Header="_File" > 
       <MenuItem Header="Save As" Command="{Binding SaveCommand}"/> 
       <Separator /> 
       <MenuItem Command="Close" /> 
      </MenuItem> 
      <MenuItem Header="_Edit"> 
       <MenuItem Command="Undo" /> 
       <Separator /> 
       <MenuItem Command="Cut" /> 
       <MenuItem Command="Copy" /> 
       <MenuItem Command="Paste" /> 
       <Separator /> 
       <MenuItem Command="SelectAll" /> 
      </MenuItem> 
     </Menu> 
     <TextBox Height="217" HorizontalAlignment="Left" Margin="0,21,0,0" Name="txtBox1" VerticalAlignment="Top" Width="238" 
       Text="{Binding Note.Data}" /> 
     <!--button works fine--> 
     <Button Content="Save" Height="23" HorizontalAlignment="Left" Margin="12,244,0,0" Name="button1" VerticalAlignment="Top" Width="75" 
       Command="{Binding SaveCommand}"/> 
    </Grid> 
</Window> 

下面是视图模型的代码。

class NoteViewModel : INotifyPropertyChanged 
{ 
    public ICommand SaveCommand { get; set; } 

    public NoteViewModel() 
    { 
     SaveCommand = new RelayCommand(Save); 
     Note = new NoteModel(); 
    } 

    private NoteModel note; 
    public NoteModel Note 
    { 
     get { return note; } 
     set 
     { 
      if (note != value) 
      { 
       note = value; 
       RaisedPropertyChanged("Note"); 
      } 
     } 
    } 

    private void Save() 
    { 
     SaveFileDialog file = new SaveFileDialog(); 

     if ((bool)file.ShowDialog()) 
     { 
      File.WriteAllText(file.FileName, Note.Data, Encoding.UTF8); 
     } 
    } 

    #region ...INPC 
    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisedPropertyChanged(string p) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(p)); 
    } 
    #endregion 
} 

我调试它,事实证明,所述命令 - 被执行(SaveCommand>Save()),但的Note.Data值为空。这是如果我使用按钮,而不是。

编辑: 额外信息:我使用MVVMLight的RelayCommand。

回答

1

可能发生的情况是,当您选择菜单项时,TextBox仍然有焦点。默认情况下,当控件失去焦点时WPF中的绑定更新(以便更新不会持续发生,就像PropertyChange是更新类型时那样)。当您使用该按钮时,TextBox失去焦点,因为按钮得到它。

您可以通过在窗口上添加另一个控件(任何类型)并在选择菜单项之前单击它来测试此项。

如果解决了这个问题,那么最简单的解决方法是将绑定更新类型更改为PropertyChange(这可以在设计器的绑定选项区域中完成)。

+0

它很棒!我感到很傻。无论如何,我正在做一个记事本,你觉得每次改变文本框的时候打电话给propertychange是个好主意吗? 谢谢! –

+0

@Shulhi:我看不出任何真正的缺点。只要你的属性是一个简单的'string'属性,除了将值存储在内存中之外什么都不做,那么你就不必担心它。 –

+0

再次感谢。最后一个问题,如果我使用剪切/复制/粘贴等内置命令,它可以很好地工作。但是像Close这样的内置命令是禁用的,尽管我已经将IsEnabled设置为true。我可以使用自定义命令,但如果可以的话,我想使用内置的命令。 –