- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 ViewModel 中有这样的东西:
public enum WorkState
{
Idle, Working, Stopping
};
public class MainViewModel : ViewModelBase
{
public const string StatePropertyName = "State";
private WorkState _state = WorkState.Idle;
public WorkState State
{
get
{ return _state; }
set
{
if (_state == value)
{
return;
}
RaisePropertyChanging(StatePropertyName);
_state = value;
RaisePropertyChanged(StatePropertyName);
StartStopCommand.RaiseCanExecuteChanged(); // <—————————————
}
}
private RelayCommand _startStopCommand;
public RelayCommand StartStopCommand
{
get
{
return _startStopCommand
?? (_startStopCommand = new RelayCommand(
() =>
{
if (State == WorkState.Idle)
{
State = WorkState.Working;
}
else if (State == WorkState.Working)
{
State = WorkState.Stopping;
new Thread(() =>
{
Thread.Sleep(5000);
State = WorkState.Idle;
}).Start();
}
},
() => (State == WorkState.Idle ||
(State == WorkState.Working)));
}
}
}
还有我 View 中的按钮:
<Button Command="{Binding StartStopCommand}">
<Button.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding State}" Value="{x:Static vm:WorkState.Idle}">
<Setter Property="Button.Content" Value="Start"/>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="{x:Static vm:WorkState.Working}">
<Setter Property="Button.Content" Value="Stop"/>
</DataTrigger>
<DataTrigger Binding="{Binding State}" Value="{x:Static vm:WorkState.Stopping}">
<Setter Property="Button.Content" Value="Stop"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
但是当我按下 Stop 按钮并且 State 属性更改为 Idle 时,按钮仅将其文本更改为“Start”但在我单击窗口中的某个位置之前保持禁用状态。
我将 RaiseCanExecuteChanged 添加到 State 属性的 setter 中,但没有帮助。
我做错了什么?
此外,我不确定这种在同一命令中使用启动/停止和设置按钮文本的 DataTriggers 的方法是最好的,所以如果有人分享更好的方法,我将不胜感激。
最佳答案
这里的问题不是 RaiseCanExecuteChanged()
不工作,而是当您的 UI 依赖它时从后台线程修改您的 State
属性。
假设我将您的代码相应地修改为:(这是与 .Net 4.5 一起使用的)
public RelayCommand StartStopCommand { get; set; }
...
public MainViewModel() {
StartStopCommand = new RelayCommand(async () => {
switch (State) {
case WorkState.Idle:
State = WorkState.Working;
break;
case WorkState.Working:
State = WorkState.Stopping;
await Task.Delay(5000);
State = WorkState.Idle;
break;
}
}, () => State == WorkState.Idle || State == WorkState.Working);
}
现在您可以看到 Button
从禁用状态正确切换回启用状态。
您可以从以下网址获取示例:Here
如果你想坚持使用你的Thread
,将它切换到:
new Thread(
() => {
Thread.Sleep(5000);
Application.Current.Dispatcher.BeginInvoke(
new Action(() => State = WorkState.Idle));
}).Start();
^^ 这现在又可以正常工作了,因为您没有从另一个线程修改属性。
关于c# - WPF MVVM Light : Command. RaiseCanExecuteChanged() 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18385213/
下面是一个很简单的Prism.Wpf以 DelegateCommand 为例两者都有Execute和 CanExecute代表。 假设 CanExecute取决于某些属性。看来 Prism 的Dele
我正在使用几个绑定(bind)到 RelayCommands 的 Buttons,这些 RelayCommands 是用 CanExecute 委托(delegate)初始化的。 RelayComma
我正在使用 PRISM 的 WPF 和 DelegateCommand 并遇到以下问题: 我开始一个异步操作,例如: public async void ProgramDevice() { v
当我在 TimerOnElapsed 方法中调用 PressCommand.RaiseCanExecuteChanged(); 时,没有任何反应。 可能是什么问题?(GalaSoft.MvvmLigh
我正在使用 Nuget (4.1.23.0) 上可用的当前版本的 MvvmLight,调用 RaiseCanExecuteChanged 似乎在单元测试中没有做任何事情。场景很简单,我有一个命令: p
更新 上传的示例项目:https://github.com/subt13/BugSamples 我重现了一个在使用 MVVMLight 框架的 Windows 10 UAP 应用程序中发生的错误。 当
我正在使用 MVVM 模式。我是我的观点,我有个人详细信息的文本框,其中之一是 idBox。此外,该 View 由几个按钮组成,其中之一是 editModeBtn。 我希望只有在 idBox 中有一个
我绝对有没有知道是什么原因造成的。 背景:使用 Prism 框架 I have a button bound to a DelegateCommand I call RaiseCanExecuteCh
我正在尝试确定使ICommands的CanExecute()反映在UI中的最佳方法。 我知道Dispatcher是处理UI绘图的WPF(引擎?),默认情况下,Dispatcher会在实例化以及活动用户
在我的 WPF 应用程序中,我有一种节点图。我已经向这些节点添加了一个 ContextMenu,当我右键单击内容等时会出现。 上下文菜单中的命令来自具有 DelegateCommands 的服务 (M
我的 ViewModel 中有这样的东西: public enum WorkState { Idle, Working, Stopping }; public class MainViewMo
我刚刚从 Prism 4.1 更新到 5,以前工作正常的代码现在抛出 InvalidOperationExceptions。我怀疑根本原因是更新的异步 DelegateCommand 没有正确编码到
我有一个文本框和一个绑定(bind)到我的 View 模型中的属性的按钮,如下所示 我的用户名属性: private string userName; public string
我正在使用 Prism 和 MVVM 开发 WPF 应用程序。 应用程序的要求之一是能够以不同的用户身份(具有不同的权限)登录。 现在大多数权限都是简单的允许或禁止显示特定 View 。所有这些都实现
我是一名优秀的程序员,十分优秀!