【发布时间】:2017-02-24 23:01:13
【问题描述】:
我有以下问题:
我有一个带有执行 canexecute 方法的中继命令,但每次我调用 raisecanexecutechanged();它在 relaycommand 中调用 raisecanexecutechanged,为其设置一个新的委托,然后返回视图模型。
相同的设置适用于另一个视图模型。我检查了 1000 次有什么不同,但我什么也没找到。
如果您能帮助我,我将不胜感激。
public RelayCommand UpdateAMSCommand { get; private set; }
public AMSSettingsViewModel(IEventAggregator eventAggregator)
{
UpdateAMSCommand = new RelayCommand(OnUpdateAMS, CanUpdateAms);
CustomAMSOffices.ListChanged += listChanged;
CustomAMSContacts.ListChanged += listChanged;
}
private void listChanged(object sender, ListChangedEventArgs e)
{
if (sender != null)
{
if (sender is BindingList<CustomAMSOffice>)
{
BindingList<CustomAMSOffice> temp = (BindingList<CustomAMSOffice>)sender;
if (temp.Count > _amsOfficesItemsCounter)
{
_amsOfficesItemsCounter = temp.Count;
for (int i = 0; i < temp.Count; i++)
{
temp[i].ErrorsChanged += RaiseCanExecuteChanged;
}
}
}
else if (sender is BindingList<CustomAMSContact>)
{
BindingList<CustomAMSContact> temp = (BindingList<CustomAMSContact>)sender;
if (temp.Count > _amsContactsItemsCounter)
{
_amsContactsItemsCounter = temp.Count;
for (int i = 0; i < temp.Count; i++)
{
temp[i].ErrorsChanged += RaiseCanExecuteChanged;
}
}
}
}
UpdateAMSCommand.RaiseCanExecuteChanged();
}
private void RaiseCanExecuteChanged(object sender, DataErrorsChangedEventArgs e)
{
UpdateAMSCommand.RaiseCanExecuteChanged();
}
private bool CanUpdateAms()
{
foreach (var cao in CustomAMSOffices)
{
if (!cao.Check() || cao.HasErrors)
{
return false;
}
}
foreach (var cac in CustomAMSContacts)
{
if (!cac.Check() || cac.HasErrors)
{
return false;
}
}
return true;
}
编辑: 我使用的中继命令:https://github.com/briannoyes/WPFMVVM-StarterCode/blob/master/ZzaDashboard/ZzaDashboard/RelayCommand.cs
【问题讨论】:
-
从你当前的代码很难说。你在使用
Thread/Task吗?尝试最小化/最大化您的窗口,看看这是否会带来一些变化? -
我只使用线程/任务在我的数据库和我的虚拟机之间进行通信。我已经试过了。
-
您可以尝试的一件事是:
await或在CanExecute方法中检查您的任务状态。 -
在调试时我没有进入 canexecute 方法,这是我的问题,我为什么要等待呢?
-
...然后显示您的
RelayCommand代码。
标签: c# wpf mvvm relaycommand canexecute