我需要帮助来弄清楚为什么我的命令对菜单项不起作用。我一直在谷歌搜索解决方案,在这里也发现了一些。但可能是因为我的知识(初学者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>
以下是ViewModel的代码。
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
- &gt; Save()
),但Note.Data
的值为空。如果我改用按钮就行了。
编辑: 额外信息:我使用MVVMLight的RelayCommand。
答案 0 :(得分:1)
当您选择菜单项时,TextBox
仍然具有焦点,可能会发生什么。默认情况下,当控件失去焦点时,WPF中的绑定会更新(因此更新不会持续发生,就像PropertyChange
是更新类型时一样)。当您使用该按钮时,TextBox
会失去焦点,因为按钮可以获得它。
您可以通过在窗口上放置另一个控件(任何类型)并在选择菜单项之前单击它来测试它。
如果这解决了问题,那么最简单的解决方法是将绑定更新类型更改为PropertyChange
(这可以在设计器的绑定选项区域中完成)。