0

我有以下示例,它模仿具有菜单和状态栏按钮的应用程序做同样的事情。

如果我只从菜单执行命令,工具栏按钮会更新得很好,但是如果我开始使用工具栏按钮,菜单和工具栏就会不同步。如果我从工具栏按钮开始,菜单会更新,直到我第一次使用菜单,也会发生同样的情况。

我错过了什么?

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}"从您的MenuItemand中删除ToggleButton.

然后,将您的更改ExecuteChangeState为自行打开,而不是传入的参数:

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

这将确保开关始终打开 State 的当前值,并且应用程序的前端始终与 State 的变量值同步。

于 2012-05-29T16:32:44.633 回答
1

我已将您的代码导入到一个新项目中。我必须导入我的 Delegate 命令的实现,这基本上是 Josh Smith 的中继命令的非通用版本,并且一切正常(无论单击哪个顺序,这两个项目都保持同步)。

我对代码所做的唯一更新是以下内容,它基本上适应了我的委托命令版本是非通用的这一事实。

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

xaml 与您的帖子保持不变(我的理解是 Path 参数在绑定中是隐式的,因此无论是否指定它都没有区别)。

我怀疑问题可能是您正在使用的 DelegateCommand 的实现有问题。或者,您发布的示例可能会从您的实际应用程序中遗漏一些给您带来问题的东西。

您确定您发布的代码充分模拟了您遇到的问题吗?

于 2012-05-29T16:35:32.943 回答