0

メニューとステータスバーボタンで同じことを行うアプリケーションを模倣した次のサンプルがあります。

メニューからのみコマンドを実行すると、ツールバー ボタンは正常に更新されますが、toolbarbutton の使用を開始すると、メニューとツールバーが同期しなくなります。メニューを最初に使用するまで、メニューが更新されるツールバー ボタンから開始する別の方法を実行すると、同じことが起こります。

私は何が欠けていますか?

C#:

using System.ComponentModel;
using System.Windows.Input;
using Picis.Wpf.Framework.Commands;

namespace CheckTest
{
public partial class Window1 : INotifyPropertyChanged
{
    private bool _state;

    public ICommand ChangeStateCommand { get; private set; }

    public bool State
    {
        get
        {
            return _state;
        }
        set
        {
            if (_state != value)
            {
                _state = value;
                this.OnPropertyChanged("State");
            }
        }
    }

    public Window1()
    {
        this.ChangeStateCommand = new DelegateCommand<bool>(ExecuteChangeState);
        InitializeComponent();
        this.DataContext = this;
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string name)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(name));
        }
    }

    #endregion

    private void ExecuteChangeState(bool state)
    {
        this.State = !state;
    }
}
}

XAML:

<Window x:Class="CheckTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="300" Width="300">
<StackPanel>
    <Menu IsMainMenu="True">
        <MenuItem IsChecked="{Binding State, Mode=OneWay}" Command="{Binding ChangeStateCommand}" CommandParameter="{Binding State}" Header="Test" IsCheckable="True"  />
    </Menu>
    <ToggleButton IsChecked="{Binding State, Mode=OneWay}" Command="{Binding ChangeStateCommand}" CommandParameter="{Binding State}" Content="Test2" />
</StackPanel>
</Window>
4

2 に答える 2

1

と から を削除する必要がありCommandParameter="{Binding State}"ます。MenuItemToggleButton

次に、ExecuteChangeState渡されたパラメーターではなく、自分自身をオンに切り替えるように変更します。

private void ExecuteChangeState()
{
    this.State = !_state;
}

これにより、スイッチが常に State の現在の値でオンになり、アプリケーションのフロントエンドが State の変数値と常に同期するようになります。

于 2012-05-29T16:32:44.633 に答える
1

あなたのコードを新しいプロジェクトにインポートしました。基本的にJosh Smith によるリレー コマンドの非汎用バージョンである Delegate コマンドの実装をインポートする必要があり、すべて正常に動作しました (2 つのアイテムは、クリックされた順序に関係なく同期されたままです)。

私が行ったコードへの唯一の更新は、基本的に私のバージョンのデリゲート コマンドが非ジェネリックであるという事実に対応する次のことでした。

private void ExecuteChangeState(object parameter)
{
    bool s = (bool)parameter;
    this.State = !s;
}

xaml は投稿から変更されていません (私の理解では、Path パラメーターはバインディングで暗黙的に指定されているため、指定されているかどうかに違いはありません)。

問題は、使用している DelegateCommand の実装に問題がある可能性があると思われます。または、投稿したサンプルには、問題を引き起こしている実際のアプリケーションの何かが欠けている可能性があります。

投稿したコードは、発生している問題を適切にモデル化していますか?

于 2012-05-29T16:35:32.943 に答える