ViewModel里的ICommand绑定时找不到问题

在ViewModel里,Command应该写成属性,而不能写成字段,不然在绑定时会找不到它
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
WPF 中,DialogResult 是一个 UI 控件的属性,而 ViewModel 是不应该直接与 UI 控件交互的。所以,我们需要使用一些技巧将 DialogResult 属性绑定ViewModel。 一种常见的方法是使用事件。在 ViewModel 中,定义一个事件,当需要关闭窗口,触发此事件。在 View 中,订阅此事件,当事件触发,设置 DialogResult 属性,从而关闭窗口。 以下是一个示例代码: ViewModel: ```c# public class MyViewModel { public event EventHandler<bool?> CloseDialog; private void OnCloseDialog(bool? result) { CloseDialog?.Invoke(this, result); } private void Save() { // Do some save logic OnCloseDialog(true); } private void Cancel() { OnCloseDialog(false); } } ``` View: ```xml <Window> <i:Interaction.Triggers> <i:EventTrigger EventName="CloseDialog"> <i:InvokeCommandAction Command="{Binding CloseCommand}" CommandParameter="{Binding EventArgs}" /> </i:EventTrigger> </i:Interaction.Triggers> </Window> ``` 在上面的代码中,我们使用了 Interactivity 库来实现事件触发命令的功能。当 CloseDialog 事件触发,会执行 CloseCommand 命令,并将 EventArgs 参数传递给命令。 在 ViewModel 中,我们需要实现 CloseCommand 命令,用于处理关闭窗口的逻辑。 ```c# public class MyViewModel { public ICommand CloseCommand { get; private set; } public MyViewModel() { CloseCommand = new RelayCommand<object>(Close); } private void Close(object parameter) { var args = parameter as EventArgs; var result = args?.Args[0] as bool?; if (result != null) { // Set DialogResult property to close the window var window = Application.Current.Windows.OfType<Window>().FirstOrDefault(w => w.IsActive); if (window != null) { window.DialogResult = result; } } } } ``` 在 Close 方法中,我们首先获取 CloseCommand 命令的参数,也就是 CloseDialog 事件的参数。然后,我们从参数中获取 DialogResult 属性的值,并将其设置为当前活动窗口的 DialogResult 属性,从而关闭窗口。 需要注意的是,我们在 Close 方法中使用了 Application.Current.Windows 属性来获取当前活动窗口。这是因为 WPF 应用程序中可能有多个窗口,而这个属性可以获取所有打开的窗口集合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值