首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >棱镜:必须显式调用RaiseCanExecuteChanged()

棱镜:必须显式调用RaiseCanExecuteChanged()
EN

Stack Overflow用户
提问于 2016-08-15 15:47:16
回答 2查看 4.4K关注 0票数 1

下面是一个非常简单的Prism.Wpf示例,它具有一个同时具有ExecuteCanExecute委托的DelegateCommand

假设CanExecute依赖于某些属性。看起来,Prism的DelegateCommand不会像其他CanExecute框架中的RelayCommand那样,在此属性发生变化时自动重新评估CanExecute条件。相反,您必须在属性设置器中显式调用RaiseCanExecuteChanged()。这将导致在任何非平凡的视图模型中出现大量重复代码。

有更好的办法吗?

ViewModel

代码语言:javascript
运行
复制
using System;
using Prism.Commands;
using Prism.Mvvm;

namespace PrismCanExecute.ViewModels
{
public class MainWindowViewModel : BindableBase
{
    private string _title = "Prism Unity Application";
    public string Title
    {
        get { return _title; }
        set { SetProperty(ref _title, value); }
    }
    private string _name;
    public string Name
    {
        get { return _name; }
        set
        {
            SetProperty(ref _name, value);

            // Prism doesn't track CanExecute condition changes?
            // Have to call it explicitly to re-evaluate CanSubmit()
            // Is there a better way?
            SubmitCommand.RaiseCanExecuteChanged();
        }
    }
    public MainWindowViewModel()
    {
        SubmitCommand = new DelegateCommand(Submit, CanSubmit);
    }

    public DelegateCommand SubmitCommand { get; private set; }
    private bool CanSubmit()
    {
        return (!String.IsNullOrEmpty(Name));
    }
    private void Submit()
    {
        System.Windows.MessageBox.Show(Name);
    }

}
}

视图

代码语言:javascript
运行
复制
<Window x:Class="PrismCanExecute.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    Title="{Binding Title}"
    Width="525"
    Height="350"
    prism:ViewModelLocator.AutoWireViewModel="True">
<Grid>
    <!--<ContentControl prism:RegionManager.RegionName="ContentRegion" />-->
    <StackPanel>
        <StackPanel Orientation="Horizontal">
            <TextBlock Text="Name: " />
            <TextBox Width="150"
                     Margin="5"
                     Text="{Binding Name,  UpdateSourceTrigger=PropertyChanged}"/>
        </StackPanel>
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Width="50"
                    Command="{Binding SubmitCommand}"
                    Content="Submit" Margin="10"/>
            <!--<Button Width="50"
                    Content="Cancel"
                    IsCancel="True" Margin="10"/>-->
        </StackPanel>
    </StackPanel>
</Grid>
</Window>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-15 16:39:12

正如@l33t所解释的,这是通过设计完成的。如果希望DelegateCommand自动监视VM属性的更改,只需在delegateCommand之外使用ObservesProperty方法:

代码语言:javascript
运行
复制
var command = new DelegateCommand(Execute).ObservesProperty(()=> Name);
票数 6
EN

Stack Overflow用户

发布于 2016-08-15 15:55:18

这是故意的。这和表演有关。

不过,您可以将Prism DelegateCommand替换为一个定制的命令,该命令可以满足您的需要。例如,实现似乎起了作用。但是,我不建议使用它。如果您有很多命令,您很可能会遇到性能问题。

另外,请看这个回答

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38958379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档