我有以下示例,它使用菜单和状态栏按钮模仿应用程序做同样的事情。
如果我只从菜单执行命令,工具栏按钮会更新,但如果我开始使用工具栏按钮,菜单和工具栏会不同步。如果我以相反的方式开始使用工具栏按钮,菜单会更新,直到我第一次使用菜单,就会发生同样的情况。
我缺少什么?
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>
答案 0 :(得分:1)
您需要从CommandParameter="{Binding State}"
和MenuItem
中删除ToggleButton
。
然后,更改您的ExecuteChangeState
以自行切换,而不是传入参数:
private void ExecuteChangeState()
{
this.State = !_state;
}
这将确保交换机始终打开State的当前值,并确保应用程序的前端始终与State的变量值同步。
答案 1 :(得分:1)
我已将您的代码导入新项目。 我必须导入我的Delegate命令的实现,它基本上是Josh Smith的relay command的非泛型版本,一切正常(无论点击哪个顺序,这两个项目都保持同步)。
我对代码的唯一更新是以下内容,它基本上适应了我的委托命令版本是非泛型的事实。
private void ExecuteChangeState(object parameter)
{
bool s = (bool)parameter;
this.State = !s;
}
xaml与你的帖子保持不变(我的理解是Path参数隐含在绑定中,所以如果指定了它就没有区别。)
我怀疑问题可能是你正在使用的DelegateCommand的实现有问题。或者,您发布的样本可能会遗漏您实际应用程序中的问题。
您确定您发布的代码能够充分模拟您遇到的问题吗?