Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 命令不适用于菜单项_C#_Wpf_Xaml_Menuitem_Relaycommand - Fatal编程技术网

C# 命令不适用于菜单项

C# 命令不适用于菜单项,c#,wpf,xaml,menuitem,relaycommand,C#,Wpf,Xaml,Menuitem,Relaycommand,我需要帮助来找出我的命令在菜单项上不起作用的原因。我一直在谷歌上搜索解决方案,在这里也发现了一些。但可能是因为我的知识(初学者WPF),我仍然无法解决它。感谢您的帮助 它适用于按钮,但不适用于菜单项 XAML: 我调试了它,结果是执行了命令(SaveCommand-->Save()),但是Note.Data的值为空。如果我用按钮来代替,这是件好事 编辑: 额外信息:我使用MVVMLight中的RelayCommand。可能发生的情况是,当您选择菜单项时,文本框仍然有焦点。默认情况下,WPF中的绑

我需要帮助来找出我的命令在菜单项上不起作用的原因。我一直在谷歌上搜索解决方案,在这里也发现了一些。但可能是因为我的知识(初学者WPF),我仍然无法解决它。感谢您的帮助

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

XAML:

我调试了它,结果是执行了命令(
SaveCommand
-->
Save()
),但是
Note.Data
的值为空。如果我用按钮来代替,这是件好事

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

可能发生的情况是,当您选择菜单项时,
文本框仍然有焦点。默认情况下,WPF中的绑定会在控件失去焦点时更新(这样更新就不会像更新类型为
PropertyChange
时那样经常发生)。当您使用按钮时,
文本框
会失去焦点,因为按钮获取了它

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


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

效果非常好!我觉得很傻。不管怎样,我正在做一个记事本,你认为每次文本框被更改时给propertychange打个电话是个好主意吗?谢谢大家!@舒尔希:我看不出有什么真正的缺点。只要您的属性是一个简单的
字符串
属性,除了将值存储在内存中之外,它没有任何作用,那么您就不必担心它。再次感谢。最后一个问题是,如果我使用诸如剪切/复制/粘贴之类的内置命令,它会工作得很好。但是像Close这样的内置命令被禁用,尽管我已经将IsEnabled设置为true。我可以只使用自定义命令,但如果可以,我希望使用内置命令。
    <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
}