gpt4 book ai didi

WPF ViewModel 命令可以执行问题

转载 作者:行者123 更新时间:2023-12-03 03:47:48 24 4
gpt4 key购买 nike

我在使用 View 模型上的上下文菜单命令时遇到一些困难。

我正在为 View 模型中的每个命令实现 ICommand 接口(interface),然后在 View (MainWindow)的资源中创建一个 ContextMenu,并使用 MVVMToolkit 中的 CommandReference 来访问当前的 DataContext (ViewModel) 命令。

当我调试应用程序时,除了创建窗口之外,命令上的 CanExecute 方法似乎不会被调用,因此我的上下文菜单项没有按照我的预期启用或禁用。

我制作了一个简单的示例( attached here ),它表明了我的实际应用程序并总结如下。任何帮助将不胜感激!

这是 View 模型

namespace WpfCommandTest
{
public class MainWindowViewModel
{
private List<string> data = new List<string>{ "One", "Two", "Three" };

// This is to simplify this example - normally we would link to
// Domain Model properties
public List<string> TestData
{
get { return data; }
set { data = value; }
}

// Bound Property for listview
public string SelectedItem { get; set; }

// Command to execute
public ICommand DisplayValue { get; private set; }

public MainWindowViewModel()
{
DisplayValue = new DisplayValueCommand(this);
}

}
}

DisplayValueCommand是这样的:

public class DisplayValueCommand : ICommand
{
private MainWindowViewModel viewModel;

public DisplayValueCommand(MainWindowViewModel viewModel)
{
this.viewModel = viewModel;
}

#region ICommand Members

public bool CanExecute(object parameter)
{
if (viewModel.SelectedItem != null)
{
return viewModel.SelectedItem.Length == 3;
}
else return false;
}

public event EventHandler CanExecuteChanged;

public void Execute(object parameter)
{
MessageBox.Show(viewModel.SelectedItem);
}

#endregion
}

最后, View 在 Xaml 中定义:

<Window x:Class="WpfCommandTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfCommandTest"
xmlns:mvvmtk="clr-namespace:MVVMToolkit"
Title="Window1" Height="300" Width="300">

<Window.Resources>

<mvvmtk:CommandReference x:Key="showMessageCommandReference" Command="{Binding DisplayValue}" />

<ContextMenu x:Key="listContextMenu">
<MenuItem Header="Show MessageBox" Command="{StaticResource showMessageCommandReference}"/>
</ContextMenu>

</Window.Resources>

<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>

<Grid>
<ListBox ItemsSource="{Binding TestData}" ContextMenu="{StaticResource listContextMenu}"
SelectedItem="{Binding SelectedItem}" />
</Grid>
</Window>

最佳答案

为了完成 Will 的回答,下面是 CanExecuteChanged 事件的“标准”实现:

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

(来自 Josh Smith 的 RelayCommand 类)

顺便说一句,您可能应该考虑使用 RelayCommandDelegateCommand :您很快就会厌倦为 ViewModel 的每个命令创建新的命令类。 ..

关于WPF ViewModel 命令可以执行问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2587916/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com