Команда не работает для пункта меню - PullRequest
0 голосов
/ 23 июня 2011

Мне нужна помощь, чтобы выяснить, почему моя команда не работает с пунктом меню. Я искал решения для этого и нашел здесь тоже немного. Но, вероятно, из-за моих знаний (начинающий 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 -> Save()) выполнена, но значение Note.Data равно нулю. Это что-то, если я вместо этого использую кнопку.

EDIT: Дополнительная информация: я использую RelayCommand из MVVMLight.

1 Ответ

1 голос
/ 23 июня 2011

Вероятно, что TextBox все еще имеет фокус, когда вы выбираете пункт меню. По умолчанию привязки в WPF обновляются, когда элемент управления теряет фокус (поэтому обновления не происходят постоянно, как это происходит, когда тип обновления PropertyChange). Когда вы используете кнопку, TextBox теряет фокус, потому что кнопка получает его.

Вы можете проверить это, поместив другой элемент управления (любой вид) в окно и щелкнув по нему, прежде чем выбрать пункт меню.

Если это решает проблему, то самое простое решение - изменить тип обновления привязки на PropertyChange (это можно сделать в области параметров привязки дизайнера).

...