Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# “一个人是怎么做的?”;禁用";WPF中使用MVVM模式的按钮?_C#_Wpf_Xaml_.net 3.5 - Fatal编程技术网

C# “一个人是怎么做的?”;禁用";WPF中使用MVVM模式的按钮?

C# “一个人是怎么做的?”;禁用";WPF中使用MVVM模式的按钮?,c#,wpf,xaml,.net-3.5,C#,Wpf,Xaml,.net 3.5,我正在努力掌握WPF和MVVM,并取得了良好的进展。WPF和MVVM方面的工作进展顺利 但是,XAML和数据绑定方面完全是另一回事:) 我将如何“禁用”按钮 例如,我的视图模型中有一个CanClose属性,用于确定应用程序当前是否可以关闭。如果工作线程停止执行某些操作,那么该属性设置为false,我希望灰显按钮,或者通过某种绑定以某种方式直观地禁用关闭按钮 我该怎么做呢 谢谢 编辑- 可惜我只能接受一个答案 这两个答案对我帮助很大。在Kent的帖子中,他进一步解释了为什么应该在应用程序中实现命令

我正在努力掌握WPF和MVVM,并取得了良好的进展。WPF和MVVM方面的工作进展顺利

但是,XAML和数据绑定方面完全是另一回事:)

我将如何“禁用”按钮

例如,我的视图模型中有一个CanClose属性,用于确定应用程序当前是否可以关闭。如果工作线程停止执行某些操作,那么该属性设置为false,我希望灰显按钮,或者通过某种绑定以某种方式直观地禁用关闭按钮

我该怎么做呢

谢谢

编辑-

可惜我只能接受一个答案

这两个答案对我帮助很大。在Kent的帖子中,他进一步解释了为什么应该在应用程序中实现命令基础结构,而不是像我所问的那样禁用按钮:

我原来问题的答案是:

只需将按钮的属性绑定到CanClose:

<Button IsEnabled="{Binding CanClose}"/>


如果您返回CanExecute of ICommand且值为false,则按钮将被禁用。因此,无论您的按钮绑定到哪个命令,都可以在您想要禁用它时返回CanExecute值false。

通过使用命令模式。在视图模型中:

public class MyViewModel : ViewModel
{
    private readonly ICommand someCommand;

    public MyViewModel()
    {
        this.someCommand = new DelegateCommand(this.DoSomething, this.CanDoSomething);
    }

    public ICommand SomeCommand
    {
        get { return this.someCommand; }
    }

    private void DoSomething(object state)
    {
        // do something here
    }

    private bool CanDoSomething(object state)
    {
        // return true/false here is enabled/disable button
    }
}
在您的XAML中:

<Button Command="{Binding SomeCommand}">Do Something</Button>
做点什么
阅读以了解有关
DelegateCommand

的更多信息此命令也适用:

查看

        <Button>
            <Button.Style>
                <Style>
                    <Setter Property="Content" Value="Scream" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding btnEnabled}" Value="True">
                            <Setter Property="IsEnabled" Value="True" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>
        </Button>
    private bool _btnEnabled;
    public bool btnEnabled
    {
        get { return _btnEnabled; }
        set
        {
            if (_btnEnabled != value)
            {
                _btnEnabled = value;
                OnPropertyChanged();
            }
        }
    }

ViewModel文件中的更改:

公共布尔值已禁用 { 获取{return\u isButtonEnabled;}

set
{
    if (_isButtonEnabled == value)
    {
        return;
    }

    _isButtonEnabled = value;
    OnPropertyChanged("IsButtonEnabled");
}
}

public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

按钮的XAML文件中的更改:IsEnabled=“{Binding IsButtonEnabled}”

没门,真的那么简单吗?我不知道我怎么会忽略这一点。让我试试。谢谢,我不敢相信我忽略了这个问题如此简单的答案。值得注意的是,如果你采用MVVM方法,并且使用命令及其CanExecute属性,根据microsoft文档,你不应该使用IsEnabled属性。它在文档中并标记为重要:很好的链接,谢谢你提供的信息。今天下午我有额外的空闲时间时,我会阅读整个内容。我认为DelegateCommand是你自己的命令模式实现,还是在.net framework中我遗漏了什么?@IanP DelegateCommand是Prism的一部分这似乎是这些天来编写WPF应用程序的实际方式……嗯……不知道DelegateCommand做什么,这对我的帮助并不像我希望的那样大……萝拉——肯特在他的博客上有一个指向DelegateCommand实现示例的链接。再次感谢!不幸的是,链接已经失效,这使得这个答案毫无用处。