我正在使用MVVM-Light,我的继电器命令工作正常,我刚刚读到我应该实现CanExecuteChanged和CanExecute.虽然我无法找到一个好的例子.
有没有人有一个如何实现这些的好例子.
CanExecute在无法执行时需要返回False,但不会只是取消按钮?
我什么时候执行CanExecuteChanged?
任何人都有任何好的例子,什么时候使用每一个,我的代码工作没有,但这篇博文说明我应该实现这些项目.
我有点困惑,因为我说我认为我只是将Enabled属性或东西绑定到ViewModel中的属性,所以我可以禁用按钮或类似的控件?
任何理解上的帮助都会非常感激.
编辑
这就是我现在所拥有的...它正在工作,但按钮不是物理禁用只有命令不运行,因为我返回false.我在构造函数中调用CanExecuteMe来强制运行RaiseCanExecuteChanged ...
这在我的viewmodel的construtor中运行
this.Page2Command = new RelayCommand(() => this.GoToPage2(), () => CanExecuteMe);
CanExecuteMe = false;
Run Code Online (Sandbox Code Playgroud)
这是我的其余代码,我从一个例子中得到了它.
private bool _canIncrement = true;
public bool CanExecuteMe
{
get
{
return _canIncrement;
}
set
{
if (_canIncrement == value)
{
return;
}
_canIncrement = value;
// Update bindings, no broadcast
//RaisePropertyChanged(CanIncrementPropertyName);
Page2Command.RaiseCanExecuteChanged();
}
}
public RelayCommand Page2Command
{
get;
private set;
}
private object GoToPage2() …Run Code Online (Sandbox Code Playgroud) 我已经阅读了Josh Smiths关于使用RelayCommand查看模型的绑定命令的文章.但是,我需要将ApplicationCommands.Save绑定到视图模型,以便当用户单击保存菜单项时,它将在窗口中处理.这怎么可能?
我正在实现一个带有execute和canExecute部分的RelayCommand.RelayCommand在没有canExecute部分的情况下工作,但是当我添加canExecute部分时,该命令会锁定按钮.只要CanExecute部分为true,RelayCommand仅检查是否可以执行按钮.一旦canExecute部分变为false,就不能再单击该按钮,即使它应该被按下.我如何确保每次点击按钮它控制是否可以执行,并且一旦无法执行它就不会永久锁定它?
RedoCommand = new RelayCommand(undoRedoController.Redo,undoRedoController.CanRedo);
public bool CanRedo()
{
redoStack.Count();
redoStack.Any();
return redoStack.Any();
}
public void Redo()
{
if (redoStack.Count() <= 0) throw new InvalidOperationException();
IUndoRedoCommand command = redoStack.Pop();
undoStack.Push(command);
command.Execute();
}
public class UndoRedoController
{
private static UndoRedoController controller = new UndoRedoController();
private readonly Stack<IUndoRedoCommand> undoStack = new Stack<IUndoRedoCommand>();
private readonly Stack<IUndoRedoCommand> redoStack = new Stack<IUndoRedoCommand>();
private UndoRedoController() { }
public static UndoRedoController GetInstance() { return controller; }
Run Code Online (Sandbox Code Playgroud) Model-View-ViewModel(MVVM)方法似乎是WPF UI开发中的领跑者模式.我读过的几乎每篇文章都暗示这是最好的做法.在许多文章中使用RelayCommand或DelegateCommand也很突出,似乎几乎不可能在不使用它们(或任何其他变体)的情况下实现MVVM.那么为什么它们不是.NET 4的一部分呢?
我知道RelayCommand实现起来非常简单,许多第三方工具包已经拥有它但我只是想知道微软为什么会遗漏一些所谓"最佳实践"实现的基本和基本的东西?
使用ICommand对象的CanExecuteCommand有什么性能影响.方法是一遍又一遍地执行的吗?
我需要迭代大约200个对象的集合,根据它确定是否应该启用绑定到Command的按钮?CanExecuteCommand是否会重复执行,这将使我的应用程序变慢
JWS Smith在MVVM上发表的MSDN杂志文章包含一个我不完全理解的lambda表达式.这段代码中param的目的是什么?
_saveCommand = new RelayCommand(param => this.Save(),
param => this.CanSave );
Run Code Online (Sandbox Code Playgroud)
翻译成我的首选语言VB它是:
Dim saveAction as New Action(Of Object)(AddressOf Me.Save)
_saveCommand = New RelayCommand(saveAction, Function(param) Me.CanSave)
Run Code Online (Sandbox Code Playgroud)
如果在CanSave或Save中使用它,我本来期望只看到param.我对lambda表达式有些新意.在我看来,看到一个既没有声明也没用过的变量对我来说很奇怪.任何解释将不胜感激.
要把它放在上下文中,RelayCommand(C#)的构造函数是:
public RelayCommand(Action<object> execute, Predicate<object> canExecute)
Run Code Online (Sandbox Code Playgroud)
在VB中:
Public Sub New(ByVal execute As Action(Of Object), _
ByVal canExecute As Predicate(Of Object))
Run Code Online (Sandbox Code Playgroud) 我在我的ViewModels中使用RelayCommands来消除后面的代码.除了这种情况外,RelayCommands正在工作:定义了RelayCommands的ViewModel随着datacontext的更改而改变.如果在datacontext更改后触发命令,则会在"旧"视图模型中触发该命令.在调试时我可以看到属性来自旧的datacontext.但是在视图中一切都很好,因为显示了正确的viewmodel的正确数据.
那么有界命令是否有可能无法对datacontext的更改作出反应?或者可能还有其他错误?
这里有一段代码:
<TabControl x:Name="TestView" DataContext="{Binding Path=SelectedParentElement}"
TabStripPlacement="Top" ItemsSource="{Binding Path=ChildElements, Mode=OneWay}"
SelectedValue="{Binding Path=SelectedChildElement, Mode=TwoWay}">
<TabControl.ContextMenu>
<ContextMenu>
<MenuItem Header="Klassifikation" Name="Klassifikation">
<MenuItem Header="Kindebene" Name="KlassisfizierendNext" Command="{Binding KlassifizierendNextCommand}"/>
</MenuItem>
</ContextMenu>
</TabControl.ContextMenu>
.......
</TabControl>
Run Code Online (Sandbox Code Playgroud)
tabcontrol的datacontext正确更改,但在更改命令后,在旧的datacontext中调用该命令.
目前,我有一个DataGrid绑定到我的ViewModel中的一些数据.我为行和列设置了ValidationRules.如果有任何验证错误,我想要阻止用户保存文件.我正在使用RelayCommands类将Open,Save等命令路由到我的ViewModel.
我是C#,WPF和MVVM模式的新手.对于这篇很长的帖子感到抱歉,我试图设置我所有的理解点(或不理解).
在研究了很多关于WPF和MVVM模式提供的命令机制的文本后,我有一些问题让我直截了当地思考如何使用这些东西.
我知道为WPF提供的命令允许为可视树的组件中保存的命令逻辑定义多个"调用点".当调用一个命令时,调用将通过可视树(从命令目标或聚焦元素开始)起泡,直到它碰到一个持有CommandBinding的元素,该CommandBinding定义了命令逻辑的位置.
看起来很不错的是,您可以在不指定逻辑和调用点的情况下定义公共命令.
我也理解,遵循MVVM模式,View的ViewModel应该处理逻辑,而命令的基本WPF实现只允许可视元素处理它,因为调用通过可视树冒泡.
然后我发现在这种情况下可以使用自定义实现,例如Josh Smith的RelayCommand,因为您将视图元素(例如按钮)调用的命令绑定到底层ViewModel中的RelayCommand对象.
但是,我不再看到它是一个命令(由WPF命令模式的定义),因为我们直接指定了ViewModel中引用的实现.使用这种方法,我们失去了能够从任何地方调用命令而不知道逻辑实现位置的所有好处.在这种情况下,为什么不直接使用Click事件处理程序(例如)?
有人可以解释一下我错在哪里吗?(感谢那些阅读帖子的人!)
问候.NR
我有一个WPF应用程序,我想将其设计模式更改为MVVM.我已使用此代码段
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FirstMVVm.Model;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows;
namespace FirstMVVm.ModelView
{
class MyViewModel: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private float result;
public float Result
{
get { return result; }
private set
{
if (result != value) {
result = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Result"));
}
}
}
}
public int Number { get; set; }
private RelayCommand _calculatePerimeterCommand;
public ICommand CalculatePerimeterCommand
{
get …Run Code Online (Sandbox Code Playgroud) relaycommand ×10
mvvm ×8
wpf ×7
command ×3
c# ×2
canexecute ×2
mvvm-light ×2
.net ×1
datacontext ×1
datagrid ×1
icommand ×1
lambda ×1
validation ×1