- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试将 ViewModel 中的变量作为参数发送到命令。命令看起来像这样:
public class EditPersonCommand : ICommand
{
private bool _CanExecute = false;
public bool CanExecute(object parameter)
{
PersonModel p = parameter as PersonModel;
CanExecuteProperty = (p != null) && (p.Age > 0);
return CanExecuteProperty;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter) { }
private bool CanExecuteProperty
{
get { return _CanExecute; }
set
{
if (_CanExecute != value)
{
_CanExecute = value;
EventHandler can_execute = CanExecuteChanged;
if (can_execute != null)
{
can_execute.Invoke(this, EventArgs.Empty);
}
}
}
}
}
ViewModel 看起来像这样:
public class PersonViewModel : ViewModelBase
{
private PersonModel _PersonModel;
private EditPersonCommand _EditPersonCommand;
///<remarks>
/// must use the parameterless constructor to satisfy <Window.Resources>
///</remarks>
public PersonViewModel()
: this(new PersonModel())
{
}
public PersonViewModel(PersonModel personModel)
{
_PersonModel = personModel;
}
public ICommand EditPersonCommand
{
get
{
if (_EditPersonCommand == null)
{
_EditPersonCommand = new EditPersonCommand();
}
return _EditPersonCommand;
}
}
}
xaml 看起来像这样:
<Button Content="Edit" HorizontalAlignment="Right" Height="20" Width="80"
Command="{Binding EditPersonCommand}"
CommandParameter="{Binding _PersonModel}" />
我试过在 ViewModel 中创建一个属性,而不是使用私有(private)局部变量名称,但这也没有用。 对象参数
在对 CanExecute
的调用中始终显示 null
并且按钮永远不会启用。如果我将 CommandParameter
值更改为 Hello
,那么我会在对 CanExecute
的调用中收到 Hello
,所以我'我不确定为什么变量不起作用。任何帮助将不胜感激。
更新:我也试过为模型创建一个公共(public)属性(我真的不想公开模型,但只是尝试看看它是否有效,但它没有)。
// Added this to the ViewModel
public PersonModel PersonModelProp
{
get
{
return _PersonModel;
}
set
{
_PersonModel = value;
OnPropertyChanged("PersonModelProp");
}
}
并将 xaml 更改为:
<Button Content="Edit" HorizontalAlignment="Right" Height="20" Width="80"
Command="{Binding EditPersonCommand}"
CommandParameter="{Binding PersonModelProp}" />
但仍然没有运气。 ViewModel 确实实现了 INotifyPropertyChanged
最佳答案
CommandParameter 始终为 null 还是您只在第一次执行时检查?
在这种情况下,您声明属性的顺序似乎很重要,因为设置 Command 属性会导致 CanExecute 在设置 CommandParameter 之前立即触发。
尝试将 CommandParameter 属性移到 Command 属性之前:
<Button Content="Edit" HorizontalAlignment="Right" Height="20" Width="80"
CommandParameter="{Binding PersonModelProp}"
Command="{Binding EditPersonCommand}" />
编辑
为确保正确引发您的事件,您应该在 PersonModelProp
值更改时引发 CanExecuteChanged 事件。
命令:
public class EditPersonCommand : ICommand
{
public bool CanExecute(object parameter)
{
PersonModel p = parameter as PersonModel;
return p != null && p.Age > 0;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
//command implementation
}
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if(handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
和 View 模型:
public class PersonViewModel : ViewModelBase
{
private PersonModel _PersonModel;
private EditPersonCommand _EditPersonCommand;
///<remarks>
/// must use the parameterless constructor to satisfy <Window.Resources>
///</remarks>
public PersonViewModel()
: this(new PersonModel())
{
_EditPersonCommand = new EditPersonCommand();
}
public PersonViewModel(PersonModel personModel)
{
_PersonModel = personModel;
}
public ICommand EditPersonCommand
{
get
{
return _EditPersonCommand;
}
}
public PersonModel PersonModelProp
{
get
{
return _PersonModel;
}
set
{
_PersonModel = value;
OnPropertyChanged("PersonModelProp");
EditPersonCommand.RaiseCanExecuteChanged();
}
}
}
关于c# - 如何将变量作为 CommandParameter 传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12371253/
我们有一个使用 VS 2015 编写的 WPF 应用程序。该应用程序在整个应用程序的多个位置都有一个错误图标,用户可以使用它来报告错误。它会启动他们的电子邮件客户端向我们的帮助票务系统发送电子邮件。
我想要一个按钮来显示这样的应用程序设置窗口: ViewModel 有点像: class MyViewModel : BindableBase { public M
如何将我当前所在的窗口作为参数传递给命令? 我喜欢在 XAML 标记中这样做: 最佳答案 在我的情况下,提供的答案都没有奏效。 这对我有用: 关于wpf - 将当前窗口作为 CommandP
关闭。这个问题需要debugging details .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 1年前关闭。 Improve this question
我正在尝试通过 CommandParameter 传递 UserName。
我正在尝试将 ViewModel 中的变量作为参数发送到命令。命令看起来像这样: public class EditPersonCommand : ICommand { private bool
我在我的 WPF 应用程序中使用 MVVM Light。 我创建了一个类 RedirectToUriCommandArgument.cs。 public class RedirectToUriComm
我正在尝试在 WPF 应用程序中将 Command 和 CommandParameter 绑定(bind)与按钮一起使用。我有这个完全相同的代码在 Silverlight 中工作得很好,所以我想知道我
是否可以有不同的 Datacontext对于 WPF Command和一个 CommandParameter ?
我有一个从 ItemsSource 创建的树 View 的 SecondViewModel实例,与我的 Window DataContext 不同。 我想通过`CommandParameter 发送属
如何通过True到 CommandParameter ? 目前我正在强制添加 Boolean.True到资源字典,但这似乎是一种笨拙的方法。 最佳答案 由于命令参数属于“对象”类型,因此 XAML 解
我有一个带有“MainView”和一些嵌套 View 的 Catel 应用程序。 嵌套 View 具有 ListView一些项目有 ContextMenu与一些 MenuItems . 在 MainV
我想得到 NamePlaylist的Item我点击一个MenuContext。但是参数总是空的,我不知道为什么。 这是 ListView 中的菜单 XML
是否可以在多重绑定(bind)中使用 CommandParameter="{Binding}"? 我正在尝试在数据网格中执行此操作。
我正在使用来自 AlexeyZakharov's weblog 的类 InvokeDelegateCommandAction根据一些人的建议,这是将参数从 View 发送回 EventTrigger
我通过 Google 和 StackOverflow 进行了很多搜索,但没有任何答案可以解决我的问题。 我有两个 Xaml 文件: MainWindow.xaml
也许这是一个愚蠢的问题,但我找不到答案:在下面的 xaml 中 CommandParameter 是什么?绑定(bind)到?或者一般来说,"{Binding}" 是什么意思?意思是? 最佳答案 {
我想通过xaml中的commandparameter将多个参数传递给命令。 在上面的示例中,我想将其他变量传递给 ID 变量旁边的命令。我怎样才能实现它?非常感谢。 最佳答案 您可以将MultiBi
我有以下 XAML: 当 GridPrintCommand 执行时,其传
我想在我的类 CommandProvider 中实现 CommandParameter,它用于命令(按钮等)并继承自 ICommand,但我不明白如何实现它。示例: XAML
我是一名优秀的程序员,十分优秀!