0

コマンドがメニュー項目で機能しない理由を理解するために助けが必要です。私はこれに対する解決策をグーグルで調べてきましたが、ここでもほとんど見つかりませんでした。しかし、おそらく私の知識(初心者の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がnullです。代わりにボタンを使うと何か。

編集:追加情報:MVVMLightのRelayCommandを使用しています。

4

1 に答える 1

1

起こりそうなことはTextBox、メニュー項目を選択したときにまだフォーカスがあるということです。既定では、コントロールがフォーカスを失うと、WPFのバインディングが更新されます(PropertyChange更新タイプの場合のように、更新が常に行われることはありません)。ボタンを使用すると、ボタンTextBoxがフォーカスを取得するため、フォーカスが失われます。

メニュー項目を選択する前に、ウィンドウに別のコントロール(任意の種類)を配置してクリックすることで、これをテストできます。

これで問題が解決した場合、最も簡単な修正は、バインディング更新タイプをに変更することですPropertyChange(これは、デザイナーのバインディングオプション領域で実行できます)。

于 2011-06-23T02:02:51.293 に答える